【问题标题】:datacontractserializer deserialize list<> always emptydatacontractserializer 反序列化列表<> 始终为空
【发布时间】:2014-04-14 14:23:09
【问题描述】:

我正在反序列化从网络服务接收到的数据。

问题是List的反序列化返回一个空列表,没有产生异常。你能帮我弄清楚为什么吗? 我们尝试了几种可能的语法。下面的代码最接近正确的解决方案,但我们无法正确反序列化为类列表。

<ArrayOfBatch xmlns="http://schemas.datacontract.org/2004/07/myns" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

<MaasBatch>
<BatchName>All Users</BatchName>
<Users>
<MaasUsers>
    <firstName>bob</firstName>
    <lastName>thetest</lastName>        
    <sourceEmail>bob@source.com</sourceEmail>
    <sourceTenantID>111</sourceTenantID>
    <targetEmail>bob@target.com</targetEmail>
    <targetTenantID>222</targetTenantID>
</MaasUsers>
</Users>
</MaasBatch>
</ArrayOfBatch>

代码:

 List<MAASBatch> lstMaasBatches = null;
        try
        {                
            string target = string.Empty;
            using (var response = request.GetResponse())
            {
                Stream streamReader = response.GetResponseStream();
                DataContractSerializer serializer = new DataContractSerializer(typeof(List<MAASBatch>));
                lstMaasBatches = (List<MAASBatch>)serializer.ReadObject(streamReader);
                streamReader.Close();                   
            }
            return lstMaasBatches;
        }
        catch (Exception exc)
        {
            return lstMaasBatches;
        }    

类:

 [DataContract(Name = "MAASBatch", Namespace = "http://schemas.datacontract.org/2004/07/myns")]
[KnownType(typeof(MAASUsers))]
public class MAASBatch
{
    [DataMember]
    public string BatchName { get; set; }
    [DataMember]
    public List<MAASUsers> Users { get; set; }

    [OnDeserializing]
    internal void OnDeserializingCallBack(StreamingContext streamingContext)
    {
        this.Users = new List<MAASUsers>();
    }
}

[DataContract(Name = "MAASUsers", Namespace = "http://schemas.datacontract.org/2004/07/myns")]    
public class MAASUsers
{
     [DataMember]
    public string firstName { get; set; }
     [DataMember]
    public string lastName { get; set; }
     [DataMember]
    public string sourceEmail { get; set; }
     [DataMember]
    public int sourceAgentID { get; set; }
     [DataMember]
    public string targetEmail { get; set; }
     [DataMember]
    public int targetAgentID { get; set; }

}

【问题讨论】:

    标签: c# xml web-services deserialization datacontract


    【解决方案1】:

    尝试将 Order 和 Name 属性添加到 Contract 类。 示例:

    [DataMember(Order = 1, Name = "firstName")]
    

    【讨论】:

      【解决方案2】:

      数据合同元素名称为“MAASUsers”,但在 xml 中该元素名为“MaasUsers”。数据合约序列化程序区分大小写,因此不会匹配这两个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 2013-03-03
        • 2011-09-29
        • 1970-01-01
        相关资源
        最近更新 更多