今天碰到一個小麻煩,XML序列化出來的資料,竟不能用 XmlDocument 讀取,出現錯誤訊息
Data at the root level is invalid. Line 1, position 1.
查了一下,序列化後資料最前面多了3 個byte [239,187,191],如果以字元來看是 65279,
也就是所謂的BOM(宣告文件是用utf8編碼)
這是原本的程式:
public string Serialize(object obj) {
//更改產生後的 xml namespace
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("", "");
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
settings.CheckCharacters =false;
XmlSerializer serializer = new XmlSerializer(obj.GetType());
MemoryStream stream = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(stream, settings)) {
serializer.Serialize(writer, obj, xmlNameSpace);
}
return Encoding.UTF8.GetString(stream.ToArray());
}
雖然知道原因,但卻不知道是怎麼產生該如何控制,於是打開了vs2008的 debug .net framework
的功能,一步一步追,查到是 settings.Encoding 的設定會影響,
然後再看到UTF8Encoding建構時有encoderShouldEmitUTF8Identifier參數可以設定
settings.Encoding = Encoding.UTF8;
改成
settings.Encoding = new UTF8Encoding(false);
搞定囉.