2010-10-17 48 views
2

我有以下的擴展方法序列化我的課....XmlSerializer的 - Ecoding不支持

 public static string SerializeToXml<T>(this object obj) 
     { 
      XDocument doc = new XDocument();   

      XmlSerializer ser = new XmlSerializer(typeof(T)); 

      using (var writer = doc.CreateWriter()) 
      { 
       ser.Serialize(writer, obj); 
      } 

      return doc.ToString(); 

     } 

這似乎很好地工作,並返回下面的字符串爲我的序列化對象:

<AuthenticatedUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Username>mark</Username> 
    <UserID>4</UserID> 
    <Roles> 
    <string>AuthenticatedUsers</string> 
    </Roles> 
    <IsValid>false</IsValid> 
</AuthenticatedUser> 

然而,當我嘗試使用下面的方法我得到這個錯誤進行反序列化字符串:

{"The encoding style '<AuthenticatedUser xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n <Username>mark</Username>\r\n <UserID>4</UserID>\r\n <Roles>\r\n <string>AuthenticatedUsers</string>\r\n </Roles>\r\n <IsMale>false</IsMale>\r\n</AuthenticatedUser>' is not valid for this call because this XmlSerializer instance does not support encoding. Use the SoapReflectionImporter to initialize an XmlSerializer that supports encoding."} 

方法....

public static T DeserializeFromXml<T>(this string xml) 
    { 
     var element = XElement.Parse(xml); 

     XmlSerializer ser = new XmlSerializer(typeof(T)); 

     using (var reader = element.CreateReader()) 
     {     
      return (T)ser.Deserialize(reader, xml); 
     } 
    } 

所以之後我讀改爲使用SoadReflectionImporter的反序列化方法的錯誤消息....

public static T DeserializeFromXml<T>(this string xml) 
    { 
     var element = XElement.Parse(xml); 

     SoapReflectionImporter soap = new SoapReflectionImporter(); 
     var mapping = soap.ImportTypeMapping(typeof(T)); 
     XmlSerializer ser = new XmlSerializer(mapping); 

     using (var reader = element.CreateReader()) 
     {     
      return (T)ser.Deserialize(reader, xml); 
     } 
    } 

但是我現在得到這個錯誤...

{"The encoding style '<AuthenticatedUser xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n <Username>mark</Username>\r\n <UserID>4</UserID>\r\n <Roles>\r\n <string>AuthenticatedUsers</string>\r\n </Roles>\r\n <IsValid>false</IsValid>\r\n</AuthenticatedUser>' is not valid for this call. Valid values are 'http://schemas.xmlsoap.org/soap/encoding/' for SOAP 1.1 encoding or 'http://www.w3.org/2003/05/soap-encoding' for SOAP 1.2 encoding."} 

有沒有人知道我要去哪裏錯了,我怎麼能成功地反序列化這個字符串?

+0

你的泛型T是如何申報的?它是可序列化的嗎? (沒關係,我發現它必須是你的序列化工作)。 – Les 2010-10-17 12:50:07

回答

0

XElement.CreateReader()不返回XDeclaration

請改爲從StringReader開始製作XmlReader

+0

感謝您的建議,但我剛剛嘗試過,我仍然得到相同的錯誤? – MarkB29 2010-10-17 12:38:03

0

你需要解析(XML)的調用和讀取器元件?既然你有字符串,你不能只反序列化字符串嗎?首先轉換爲字節...

byte [] bytes = Encoding.Unicode.GetBytes(xml); 
MemoryStream mem = new MemoryStream(bytes); 
returnValue = (T)ser.Deserialize(mem); 
+0

你可以在'StringReader'附近製作'XmlReader' – SLaks 2010-10-17 13:07:31

0

爲什麼使用XmlSerializer?

除非你必須控制輸出XML的樣子,你應該使用的DataContractSerializer

這裏是一個nice blog post大約兩個

3

的問題是,您所呼叫的反序列化方法的重載:

  return (T)ser.Deserialize(reader, xml); 

調用中的xml參數指定編碼風格,但在這種情況下,您正在從序列化中傳遞xml。只需刪除第二個參數,只需調用Deserialize與讀者,它應該工作得很好:

  return (T)ser.Deserialize(reader);