感谢二楼这位!你说的这个我试过了,我使用UE打开XML后,另存为UTF-8文件,定义也是<?xml version="1.0" encoding="UTF-8"?>,但仍报错:XML 文档(1, 1)中有错误。关于反序列化,我的代码是这样写的: using (MemoryStream ms = new MemoryStream()) { using (StreamWriter sw = new StreamWriter(ms)) { sw.Write(sXml); sw.Flush(); ms.Seek(0, SeekOrigin.Begin); XmlSerializer sr = new XmlSerializer(tpResType); return sr.Deserialize(ms); } }new StreamWriter(ms)改成new StreamWriter(ms, Encoding.UTF8)也报同样的错!
我拿你的xml生成的xsd和cs做下面的测试结果: 指挥中心 指挥中心 指挥中心// DataBaseConfig_ANSI_gb2312.xml: 在notepadd++里面转成ANSI格式,<?xml version="1.0" encoding="gb2312"?> DataBaseConfig_UTF8_UTF8.xml: 在notepadd++里面转成UTF-8无BOM格式,<?xml version="1.0" encoding="utf-8"?> DataBaseConfig_UTF8_gb2312.xml: 在notepadd++里面转成UTF-8无BOM格式,<?xml version="1.0" encoding="gb2312"?> static void Main(string[] args) { XmlSerializer sr = new XmlSerializer(typeof(DataBaseConfig)); DataBaseConfig data_ANSI_GB2312 = null; DataBaseConfig data_UTF8_UTF8 = null; DataBaseConfig data_UTF8_GB2312 = null; using (MemoryStream ms = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(ms, Encoding.GetEncoding("GB2312"))) { using (StreamReader reader = new StreamReader("DataBaseConfig_ANSI_gb2312.xml", Encoding.GetEncoding("GB2312"))) { writer.Write(reader.ReadToEnd()); writer.Flush(); ms.Position = 0; data_ANSI_GB2312 = sr.Deserialize(ms) as DataBaseConfig; } } } using (MemoryStream ms = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(ms, Encoding.UTF8)) { using (StreamReader reader = new StreamReader("DataBaseConfig_UTF8_UTF8.xml", Encoding.UTF8)) { writer.Write(reader.ReadToEnd()); writer.Flush(); ms.Position = 0; data_UTF8_UTF8 = sr.Deserialize(ms) as DataBaseConfig; } } } using (MemoryStream ms = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(ms, Encoding.GetEncoding("GB2312"))) { using (StreamReader reader = new StreamReader("DataBaseConfig_UTF8_GB2312.xml", Encoding.UTF8)) { writer.Write(reader.ReadToEnd()); writer.Flush(); ms.Position = 0; data_UTF8_GB2312 = sr.Deserialize(ms) as DataBaseConfig; } } } Console.WriteLine(data_ANSI_GB2312.OracleDBConfig[0].OracleItem[0].Desc); Console.WriteLine(data_UTF8_UTF8.OracleDBConfig[0].OracleItem[0].Desc); Console.WriteLine(data_UTF8_GB2312.OracleDBConfig[0].OracleItem[0].Desc); Console.ReadLine(); }
根据你的描述 encoding="UTF-8",xml无法正常打开,改成encoding="GB2312"后可以打开,这个文件的格式很可能是ANSI的。建议你xml就定义成<?xml version="1.0" encoding="UTF-8"?>,再把文件转成UTF-8格式,应该就可以了。另外关于你的序列化反序列化,应该也是编码问题造成的。不清楚你的sr.Deserialize(ms),ms是什么对象,MemoryStream?那么在序列化反序列化生成ms的时候,可以考虑用支持指定Encoding的方式,比如StreamReader/StreamWriter,指定成你需要的编码方式。
你可以试下,将Desc的值直接转为字节数组,这样序列化肯定不会出错了。
using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter sw = new StreamWriter(ms))
{
sw.Write(sXml);
sw.Flush(); ms.Seek(0, SeekOrigin.Begin);
XmlSerializer sr = new XmlSerializer(tpResType);
return sr.Deserialize(ms);
}
}new StreamWriter(ms)改成new StreamWriter(ms, Encoding.UTF8)也报同样的错!
指挥中心
指挥中心
指挥中心//
DataBaseConfig_ANSI_gb2312.xml: 在notepadd++里面转成ANSI格式,<?xml version="1.0" encoding="gb2312"?>
DataBaseConfig_UTF8_UTF8.xml: 在notepadd++里面转成UTF-8无BOM格式,<?xml version="1.0" encoding="utf-8"?>
DataBaseConfig_UTF8_gb2312.xml: 在notepadd++里面转成UTF-8无BOM格式,<?xml version="1.0" encoding="gb2312"?> static void Main(string[] args)
{
XmlSerializer sr = new XmlSerializer(typeof(DataBaseConfig)); DataBaseConfig data_ANSI_GB2312 = null;
DataBaseConfig data_UTF8_UTF8 = null;
DataBaseConfig data_UTF8_GB2312 = null; using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter(ms, Encoding.GetEncoding("GB2312")))
{
using (StreamReader reader = new StreamReader("DataBaseConfig_ANSI_gb2312.xml", Encoding.GetEncoding("GB2312")))
{
writer.Write(reader.ReadToEnd());
writer.Flush();
ms.Position = 0;
data_ANSI_GB2312 = sr.Deserialize(ms) as DataBaseConfig;
}
}
} using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter(ms, Encoding.UTF8))
{
using (StreamReader reader = new StreamReader("DataBaseConfig_UTF8_UTF8.xml", Encoding.UTF8))
{
writer.Write(reader.ReadToEnd());
writer.Flush();
ms.Position = 0;
data_UTF8_UTF8 = sr.Deserialize(ms) as DataBaseConfig;
}
}
} using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter(ms, Encoding.GetEncoding("GB2312")))
{
using (StreamReader reader = new StreamReader("DataBaseConfig_UTF8_GB2312.xml", Encoding.UTF8))
{
writer.Write(reader.ReadToEnd());
writer.Flush();
ms.Position = 0;
data_UTF8_GB2312 = sr.Deserialize(ms) as DataBaseConfig;
}
}
} Console.WriteLine(data_ANSI_GB2312.OracleDBConfig[0].OracleItem[0].Desc);
Console.WriteLine(data_UTF8_UTF8.OracleDBConfig[0].OracleItem[0].Desc);
Console.WriteLine(data_UTF8_GB2312.OracleDBConfig[0].OracleItem[0].Desc); Console.ReadLine();
}