關於(十六進制值 0x00)是無效的字符

       終於把自已惡搞一把,平時圖省勁用山寨客戶端向服務器提交數據,數據編碼一直有問題。鄙人負責服務器的WCF接口開發,於是有一天測試WCF時填了自己的用戶名,接下來報錯

(十六進制值 0x00)是無效的字符 ,報應啊。

      我首先是把WCF返回的對象序列化一下,存入數據庫。需要時反序列化,結果有些編碼不對的對象在這時出了問題。百度了一些國內的解決方法,例如替換

'\0'或者寫函數過濾,都解決不了問題。只能求助google中的英文資料了,結果是一很簡單的事,用xmlTextReader把stringReader包裝一下即可。

     總結,各類山寨客戶端是測試的神器。好多錯誤信息抱的是中文錯誤,找不到中文資料時想法找到這個錯誤描述的英文原文,google之。

兩種解決方法代碼如下:

引用自http://baleinoid.com/whaly/2011/08/xml-deserialization-invalid-character/

Here is an example :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class MyObject
{
    public string MyString { get; set; }
}
 
class Program
{
    static void Main(string[] args)
    {
         
        XmlSerializerFactory fact = new XmlSerializerFactory();
        XmlSerializer ser = fact.CreateSerializer(typeof(MyObject));
 
        MyObject obj0 = new MyObject();
        obj0.MyString = "Hello\0World";
 
        // Serialize the object
        StringWriter sw = new StringWriter();
        ser.Serialize(sw, obj0);
        string xml = sw.ToString();
        // We can check that in the xml a \0 is transformed in �
        Console.WriteLine(xml);
 
        // Classic use of XmlReader.Create
        StringReader sr1 = new StringReader(xml);
        XmlReader xr1 = XmlTextReader.Create(sr1); // xr1's type is XmlTextReaderImpl
        try
        {
            MyObject obj1 = (MyObject)ser.Deserialize(xr1);
            Console.WriteLine("XmlReader [CheckCharacters({0})] : Success : {1}", xr1.Settings.CheckCharacters, obj1.MyString);
            Console.WriteLine(obj1.MyString);
        }
        catch (Exception e)
        {
            Console.WriteLine("XmlReader [CheckCharacters({0})] : Error : {1}", xr1.Settings.CheckCharacters, e.InnerException);
        }
 
        // Using an XmlTextReader
        StringReader sr2 = new StringReader(xml);
        XmlTextReader xr2 = new XmlTextReader(sr2);
        // xr2.Settings is null
        MyObject obj2 = (MyObject)ser.Deserialize(xr2);
        Console.WriteLine("XmlTextReader : Success : {0}", obj2.MyString);
 
        // Using XmlReader with the good XmlReaderSettings
        StringReader sr3 = new StringReader(xml);
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.CheckCharacters = false; // default value is true;
        XmlReader xr3 = XmlTextReader.Create(sr3, settings); // xr3.Settings.CheckCharacters is a read only and xr3's type is XmlTextReaderImpl
        MyObject obj3 = (MyObject)ser.Deserialize(xr3);
        Console.WriteLine("XmlReader [CheckCharacters({0})] : Success : {1}", xr3.Settings.CheckCharacters, obj3.MyString);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章