unicorn.net

我的連結

Blog Stats

每月文章

隨筆分類

影像集

.net

blog

forum

friends

jQuery

open source

tools

web

Tuesday, September 02, 2008 #

XML序列化出來卻無法用XmlDocument讀取,因為utf8的BOM

今天碰到一個小麻煩,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);

搞定囉.

posted @ 6:14 PM | Feedback (1)