【问题标题】:Can't deserialize XML to object无法将 XML 反序列化为对象
【发布时间】:2012-05-15 06:51:45
【问题描述】:

我在反序列化从 Web 服务收到的 XML 响应时遇到问题。响应如下所示:

<CreateSubscribersResultCollection xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <CreatedSubscriberIds xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:long>206464306</a:long>
        <a:long>306664316</a:long>
    </CreatedSubscriberIds>
    <FailedCreatedSubscribers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
</CreateSubscribersResultCollection>

我用来反序列化 XML 的代码如下所示:

internal T GetQueuedResults<T>(string url)
{
    WebRequest request = GetRequestObject(url, "GET");
    var httpResponse = (HttpWebResponse)request.GetResponse();

    using (var responseStream = httpResponse.GetResponseStream())
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        var response = (T)xmlSerializer.Deserialize(responseStream);

        return response;
    }
}

当我反序列化(传递CreateSubscribersResultCollection 类型)时,我完全没有错误,而是CreatedSubscriberIds 的长度为0。我很确定错误在于我如何设计CreateSubscribersResultCollection 类,但我无法弄清楚错误可能是什么。该类如下所示:

[DataContract]
public class CreateSubscribersResultCollection : RequestBase
{
    [XmlArray("CreatedSubscriberIds")]
    [XmlArrayItem(typeof(long))]
    public List<long> CreatedSubscriberIds { get; set; }

    [XmlElement("FailedCreatedSubscribers")]
    public string FailedCreatedSubscribers { get; set; }
}

当我实例化该类并对其进行序列化时,出于调试目的,我得到以下结果:

<CreateSubscribersResultCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <CreatedSubscriberIds>
        <long>206464306</long>
        <long>306664316</long>
    </CreatedSubscriberIds>
    <FailedCreatedSubscribers />
</CreateSubscribersResultCollection>

我希望有人知道我做错了什么。我一直在反对这个问题太久了,谷歌对我没有任何帮助。

【问题讨论】:

  • 您需要指定命名空间。尝试在 XmlArrayItem XmlElement 属性中添加命名空间。
  • 您是否尝试使用 DataMember 属性标记您的属性?
  • @EmmieGabrielleLewis Lewis,是的,我有,但无济于事。
  • @Reniuz,我知道如何添加命名空间。但我无法得到想要的结果(看起来像响应 xml)。
  • @sundown 看起来你不知道。 eyossis 写了我所说的,解决了你的问题。

标签: c# .net xml-serialization


【解决方案1】:

尝试这样指定命名空间:

    [DataContract]
public class CreateSubscribersResultCollection : RequestBase
{
    [XmlArray("CreatedSubscriberIds")]
    [XmlArrayItem(typeof(long), Namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
    public List<long> CreatedSubscriberIds { get; set; }

    [XmlElement("FailedCreatedSubscribers")]
    public string FailedCreatedSubscribers { get; set; }
}

【讨论】:

【解决方案2】:

确保GetResponseStream() 中有数据。要测试尝试将其保存到文件中,而不是进行网络连接。将其保存到数据文件并反序列化。如果它正在被连载,那是大部分的战斗。如果序列化正确,反序列化应该没有问题。

【讨论】:

  • 响应流有数据。我也不是第一个序列化数据的人,我从 web 服务获取 xml。
  • 您需要所有用于序列化数据的类。你需要实际的课程和一切。当有反序列化出现问题时,通常会说递归异常或没有数据。确保类契约与数据最初的序列化方式相似。序列化中使用的类应该与反序列化时的类 100% 相似。还要在属性和值中包含 [DataMember]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多