我正在尝试将 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 文件中字段的顺序,使 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 中的字段顺序
解决方案:我更新了
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作为问题的一部分发布的。)