終於把自已惡搞一把,平時圖省勁用山寨客戶端向服務器提交數據,數據編碼一直有問題。鄙人負責服務器的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); } } |