【问题标题】:XmlSerializer - Encoding not supportedXmlSerializer - 不支持编码
【发布时间】:2010-10-17 12:18:51
【问题描述】:

我有以下扩展方法来序列化我的类....

        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."}

有谁知道我哪里出错了以及如何成功反序列化这个字符串?

【问题讨论】:

  • 你的通用 T 是如何声明的?它是可序列化的吗? (没关系。我知道如果您的序列化有效,那一定是)。

标签: c# .net


【解决方案1】:

问题是您正在调用的 Deserialize 方法的重载:

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

调用中的 xml 参数指定编码样式,但在这种情况下,您是从序列化中传递 xml。只需删除第二个参数,然后使用阅读器调用 Deserialize,它应该可以正常工作:

            return (T)ser.Deserialize(reader);

【讨论】:

    【解决方案2】:

    XElement.CreateReader() 不返回 XDeclaration

    请尝试从 StringReader 创建一个 XmlReader

    【讨论】:

    • 感谢您的建议,但我刚刚尝试过,仍然遇到同样的错误?
    【解决方案3】:

    你为什么使用 XmlSerializer ?

    除非您必须控制输出 XML 的外观,否则您应该使用 DataContractSerializer

    这里有一个nice blog post关于这两个

    【讨论】:

      【解决方案4】:

      您需要 Parse(xml) 调用和 reader 元素吗?既然你有字符串,你就不能反序列化字符串吗?先转换成字节...

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

      【讨论】:

      • 你可以在StringReader周围创建一个XmlReader
      猜你喜欢
      • 2021-11-25
      • 2011-07-23
      • 2011-02-24
      • 2014-10-05
      • 2019-05-21
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多