2016-09-21 69 views
0

我已經搜查了很多,無法找到一個解決方案,並不能確定正確的方法XML反序列化編碼問題

我序列化對象到XML字符串,並使用C#反序列化回的對象。序列化後的XML字符串添加了領先的?當我dezerialize回我正在一個錯誤的對象有XML文檔中的錯誤(1,1)

?<?xml version="1.0" encoding="utf-16"?> 

序列化代碼:

string xmlString = null; 
MemoryStream memoryStream = new MemoryStream(); 
XmlSerializer xs = new XmlSerializer(typeof(T)); 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("abc", "http://example.com/abc/"); 
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream,Encoding.Unicode); 
xs.Serialize(xmlTextWriter, obj, ns); 
memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
xmlString = ConvertByteArrayToString(memoryStream.ToArray()); 

ConvertByteArrayToString:

UnicodeEncoding encoding = new UnicodeEncoding(); 
    string constructedString = encoding.GetString(characters); 

反序列化代碼:

XmlSerializer ser = new XmlSerializer(typeof(T)); 
StringReader stringReader = new StringReader(xml); 
XmlTextReader xmlReader = new XmlTextReader(stringReader); 
object obj = ser.Deserialize(xmlReader); 
xmlReader.Close(); 
stringReader.Close(); 
return (T)obj; 

我想知道我在做什麼編碼錯誤,我需要一個適用於大多數情況的解決方案。由於

回答

0

使用下面的函數進行序列化和反序列化

public static string Serialize<T>(T dataToSerialize) 
{ 
    try 
    { 
     var stringwriter = new System.IO.StringWriter(); 
     var serializer = new XmlSerializer(typeof(T)); 
     serializer.Serialize(stringwriter, dataToSerialize); 
     return stringwriter.ToString(); 
    } 
    catch 
    { 
     throw; 
    } 
} 

public static T Deserialize<T>(string xmlText) 
{ 
    try 
    { 
     var stringReader = new System.IO.StringReader(xmlText); 
     var serializer = new XmlSerializer(typeof(T)); 
     return (T)serializer.Deserialize(stringReader); 
    } 
    catch 
    { 
     throw; 
    } 
} 
0

你的串行化XML包含一開始就Unicode byte-order mark,而這正是解串器失敗。

要刪除的BOM,你需要創建一個不同的版本編碼抑制BOM而不是使用默認Encoding.Unicode的:

new XmlTextWriter(memoryStream, new UnicodeEncoding(false, false)) 

這裏第二false防止BOM被前置到字符串。