XmlTextWriter序列化问题

我正在尝试创建一个xml。 我用xsd.exe创建了数据类。 根类是MESSAGE

因此,在创建MESSAGE并填充其所有属性后,我将其序列化为:

 serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); StringWriter sw = new StringWriter(); serializer.Serialize(sw, response); string xml = sw.ToString(); 

到目前为止一切顺利,字符串xml包含有效(UTF-16编码)xml。 现在我喜欢用UTF-8编码创建xml,所以我这样做:

编辑 :忘记包含流的声明

 serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); using (MemoryStream stream = new MemoryStream()) { XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8); serializer.Serialize(xtw, response); string xml = Encoding.UTF8.GetString(stream.ToArray()); } 

问题就出现了:使用这种方法,xml字符串前面加上一个无效的char(臭名昭着的方块)。
当我像这样检查char:

 char c = xml[0]; 

我可以看到c的值为65279。
有人知道这是来自哪里?
我可以通过切掉第一个字符来轻松解决这个问题:

 xml = xml.SubString(1); 

但我宁愿知道发生了什么,而不是盲目地切割第一个字符。

有人可以对此有所了解吗? 谢谢!

这是您的代码修改为不添加字节顺序标记( BOM ):

 var serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); Encoding utf8EncodingWithNoByteOrderMark = new UTF8Encoding(false); XmlTextWriter xtw = new XmlTextWriter(stream, utf8EncodingWithNoByteOrderMark); serializer.Serialize(xtw, response); string xml = Encoding.UTF8.GetString(stream.ToArray()); 

65279是Unicode字节顺序标记 – 你确定你得到的是65249吗? 假设它确实 BOM,您可以通过创建不使用BOM的UTF8Encoding实例来消除它。 (有关详细信息,请参阅构造函数重载。)

但是,有一种更简单的方法可以获得UTF-8。 您可以使用StringWriter ,但是可以覆盖Encoding属性的派生类。 请参阅此答案以获取示例。