none
Serialize成XML時的怪現象 RRS feed

  • 問題

  • 當在序列化class成xml時,會發現,

    1、轉出來的xml,後面常常會帶一大串的「\0」,還要手動濾掉,否則會造成Deserialize時出錯,大家有遇過這種情形嗎?該如何解決呢?

    2、轉出來的xml編碼怪怪的,例如最開頭的「<?」,在用UTF8編碼來轉時,會變成「嚜?」的亂碼,後面的文字都正常,但是開頭一錯,一樣使得Deserialize時出錯。

    我嘗試用Encoding.Default來Serialize,好像就不會變亂碼了,可是這麼一來,如果class的內容中有特殊字(如「喆」),就糟了…

     

    想請問以上兩個問題,是否有解決的方法呢?

    先謝了

    2007年5月8日 下午 06:18

所有回覆

  • HI,

     

    可以把程式碼貼出來看看嗎?

     

    tihs

    2007年5月9日 上午 01:37
  • Hi,

    程式碼大致如下:

     

    public string ConvertXml(Encoding e, TestClass test)
            {
                System.IO.MemoryStream m = new System.IO.MemoryStream();
                System.Xml.XmlTextWriter r = new XmlTextWriter(m, e);
                System.Xml.Serialization.XmlSerializer s = new XmlSerializer(test.GetType());
                s.Serialize(r, test);

    string xml = e.GetString(m.GetBuffer());

    return xml;

    }

     

    測試類別可自己亂設,例如:

    public class TestClass
        {
            public DateTime a1=DateTime.Now;
            public string a2 = "喆我";
        }

     

    1、開頭的「<?」變亂碼的問題找出來了,是之前XmlTestWriter跟最後GetString的編碼選的不一致會發生。

           現在兩者設為一致就不會了。

    2、所產生出來的XML,最後面都會帶一大串的「\0」,不明原因,請各位先進賜教,謝謝

     

    2007年5月9日 下午 05:09
  • 自問自答,試出來了,

    最後取得MemoryStream裡裝的字串那一段,改成:

    byte[] a = new byte[m.Length];
                m.Seek(0, System.IO.SeekOrigin.Begin);
                m.Read(a, 0, (int)m.Length);

    string t1 = System.Text.Encoding.UTF8.GetString(a);

     

    出來的xml,後面就不會帶一大串「\0」了…

     

    不過好奇的是,為什麼不能直接用GetBuffer()呢?

     

    2007年5月9日 下午 05:41