2009-06-09 60 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