datacontractserializer deserialize 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>[email protected]</sourceEmail>
    <sourceTenantID>111</sourceTenantID>
    <targetEmail>[email protected]</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; }

}

person CloudAnywhere    schedule 14.04.2014    source แหล่งที่มา


คำตอบ (2)


ลองเพิ่มแอตทริบิวต์ Order and Name ให้กับคลาส Contract ตัวอย่าง:

[DataMember(Order = 1, Name = "firstName")]
person Ricardo Vicentini    schedule 11.08.2014

ชื่อองค์ประกอบสัญญาข้อมูลคือ "MAASUsers" แต่ใน xml องค์ประกอบจะมีชื่อว่า "MaasUsers" ตัวซีเรียลไลเซอร์สัญญาข้อมูลจะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดังนั้นมันจะไม่ตรงกับสองตัวนี้

person Ballinator    schedule 06.05.2015