反序列化XML不适用于一个字段

时间:2012-02-25 04:10:27

标签: xml serialization

我试图将XML流反序列化为对象。它适用于除一个领域以外的所有领域,我无法弄清楚该领域的问题。为了确保我知道我在处理什么,我直接编写了XML字符串。

[DataContract(Name = "auth")]
public class Authorization
{
    [DataMember(Name = "status")]
    public string Status { get; set; }
    [DataMember(Name = "user_name")]
    public string UserName { get; set; }
    [DataMember(Name = "person_pk")]
    public string PersonID { get; set; }
}

StringBuilder sb = new StringBuilder();
sb.Append("<auth xmlns=\"http://schemas.datacontract.org/2004/07/Veracross\">");
sb.Append("<status>success</status>");
sb.Append("<person_pk>2516</person_pk>");
sb.Append("<user_name>scohen</user_name>");
sb.Append("</auth>");

string fixedXMLData = sb.ToString();

DataContractSerializer serializer = new DataContractSerializer(typeof(Authorization));
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(fixedXMLData));
Authorization Auth = (Authorization)serializer.ReadObject(stream);

当我在执行后测试Auth对象时,我发现Status和UserName已正确填充。 PersonID为null。我尝试更改XML字符串中的字段名称,重新排序字段,更改person_pk字段的内容等。没有什么能使它工作。

现在这里变得奇怪 - 如果我改变了#34; person_pk&#34;到&#34;测试&#34;在任何地方,它工作正常,我得到PersonID的正确值。但是,如果我换掉&#34; person_pk&#34;对于&#34; person&#34;或&#34; pk&#34;它仍然不起作用?实际上,我从RESTful服务获取此XML字符串,并且无法控制字段的命名。该字段名为&#34; person_pk&#34;,我只是无法弄清楚它为什么不能正确反序列化。

有什么想法吗?

由于

解决方案: 我更新了我的DataMember属性以包含Order属性:

[DataContract(Name = "auth")]
public class Authorization
{
    [DataMember(Name = "status", Order=0)]
    public string Status { get; set; }
    [DataMember(Name = "person_pk", Order=1)]
    public string PersonID { get; set; }
    [DataMember(Name = "user_name", Order=2)]
    public string UserName { get; set; }
}

1 个答案:

答案 0 :(得分:0)

更改XML文件中的字段顺序,以便 person_pk 出现在状态之前:

sb.Append("<auth xmlns=\"http://schemas.datacontract.org/2004/07/Veracross\">");
sb.Append("<person_pk>2516</person_pk>");
sb.Append("<status>success</status>");
sb.Append("<user_name>scohen</user_name>");
sb.Append("</auth>");

DataSerializer也会考虑字段顺序。

更新: 您可能对此讨论感兴趣: Ignore field order in DataContractSerializer