XmlTextWriter序列化问题

时间:2009-06-09 13:03:32

标签: c# .net serialization

我正在尝试创建一个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 c = xml[0];

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

xml = xml.SubString(1);

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

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

2 个答案:

答案 0 :(得分:16)

这是您的代码修改为不添加字节顺序标记(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());

答案 1 :(得分:6)

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

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