解决方案 »

  1.   

    应该是你的xml文件的编码问题你可以用notepad++或者ue之类的编辑软件打开你的xml文件,看下文件的编码格式是什么。
    根据你的描述 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,指定成你需要的编码方式。
      

  2.   

    我在用序列化的时候,也在用户名加密的时候遇到麻烦,解决方案是,直接将汉字转为字节进行存储,反序列化后在转为汉字。
    你可以试下,将Desc的值直接转为字节数组,这样序列化肯定不会出错了。
      

  3.   

    感谢二楼这位!你说的这个我试过了,我使用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)也报同样的错!
      

  4.   

    我拿你的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();
            }