2010-10-17 2 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 объявлен? Это сериализуемо? (Nevermind. Я вижу, что это должно произойти, если ваш сериализатор работал). – Les

ответ

0

XElement.CreateReader() не возвращает XDeclaration.

Вместо этого попробуйте сделать XmlReader с StringReader.

+0

Спасибо за предложение, но я только что попробовал, и я все равно получаю ту же ошибку? – MarkB29

0

Вам нужен вызов Parse (xml) и элемент чтения? Поскольку у вас есть строка, не можете ли вы просто десериализовать строку? Первый конвертировать в байты ...

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

Вы можете создать 'XmlReader' вокруг' StringReader' – SLaks

0

Почему вы используете XmlSerializer?

Если вы не должны контролировать, как выходной XML выглядит, вы должны использовать DataContractSerializer

Вот nice blog post о двух

3

Проблема является перегрузка метода десериализации, что вы звоните:

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

Параметр xml в вызове определяет стиль кодировки, но в этом случае вы передаете xml из сериализации. Просто удалите второй параметр и просто вызовите Deserialize с помощью считывателя, и он должен работать нормально:

  return (T)ser.Deserialize(reader); 
Смежные вопросы