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

问题描述 投票:0回答:2

我正在尝试将 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 为空。我尝试过更改 XML 字符串中的字段名称、重新排序字段、更改 person_pk 字段的内容等。但没有任何效果。

现在事情变得奇怪了 - 如果我在所有地方将“person_pk”更改为“test”,它就可以正常工作,并且我会得到正确的 PersonID 值。但是,如果我将“person_pk”交换为“person”或“pk”,它仍然不起作用吗?实际上,我是从 RESTful 服务获取此 XML 字符串,并且无法控制字段的命名。该字段名为“person_pk”,我只是不明白为什么它不能正确反序列化。

有什么想法吗?

谢谢

解决方案: 我更新了我的 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; }
}
xml serialization
2个回答
0
投票

更改 XML 文件中字段的顺序,使 person_pk 位于 status 之前:

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 也考虑字段顺序。

更新: 您可能对此讨论感兴趣: 忽略 DataContractSerializer 中的字段顺序


0
投票

解决方案:我更新了

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; }
}

(这个答案最初是由OP作为问题的一部分发布的。)

© www.soinside.com 2019 - 2024. All rights reserved.