2009-06-09 63 views
15

我正在尝试创建一块xml。我用xsd.exe创建了数据类。 根类是MESSAGEXmlTextWriter序列化问题

因此,创建一个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 c = xml[0]; 

我可以看到,c具有65279.
任何人的价值的线索,其中,这是哪里来的?
我可以很容易地通过切断第一炭解决这个问题:

xml = xml.SubString(1); 

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

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

+0

参见:http://stackoverflow.com/questions/955611/xmlwriter-to-write-to-a 955989#955698 – 2009-06-09 13:09:18

回答

15

这里的修改你的代码,不预先考虑字节顺序标记(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()); 
6

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

但是,有一种更容易获取UTF-8的方法。您可以使用StringWriter,但可以使用覆盖Encoding属性的派生类。一个例子见this answer

+0

我运行了代码,得到了65279个代码。可能是问题中的错字。 – 2009-06-09 13:19:20

+0

错字确实...更新;-) – fretje 2009-06-09 13:24:30