【发布时间】:2012-01-30 05:17:56
【问题描述】:
我有以下 XML:
<?xml version="1.0" ?>
<Responses>
<ResponseList>
<Response type="XXX">
<Foo>YYYY</Foo>
<Bar>ZZZZ</Bar>
</Response>
</ResponseList>
</Responses>
我的类应该是什么样子才能将字符串反序列化为对象(我正在使用 DataContractSerializer)
[DataContract(Namespace = "")]
[Serializable]
public class Responses : DataContainer
{
[DataMember]
public ResponseCollection ResponseList { get; set; }
}
[Serializable]
public class Response : DataContainer
{
[DataMember]
public string Foo { get; set; }
[DataMember]
public string Bar { get; set; }
}
[Serializable]
public class ResponseCollection : List<Response>
{
}
[编辑] 我实际上能够让它与 DataContractSerializer 一起工作......我的目标是利用 DataContractSerializer 将 XML 字符串(响应)反序列化为对象,并且我得到了两个属性(foo 和 bar)的 NULL。
[Serializable]
[DataContract(Namespace = "")]
public class Responses : DataContainer
{
[DataMember(Name = "ResponseList")]
public Response[] Response { get; set; }
}
[Serializable]
[DataContract(Namespace = "")]
public class Response : DataContainer
{
[DataMember(Order = 0)]
public string Foo { get; set; }
[DataMember(Order = 1)]
public string Bar { get; set; }
}
【问题讨论】:
-
过去遇到这样的问题时,我已经构建了一个尽可能匹配xml定义的类,创建一个实例并用给定的测试数据填充它,然后序列化它。将结果与给定的 xml 输入进行比较并进行调整,直到它通过您的测试。然后,您应该能够反序列化到该类中。我也很想知道是否有更简单的方法。
-
你不能用
DataContractSerializer做你想做的事。它不使用属性。 -
@John Saunders - 实际上,
DataContractSerializer确实使用属性,如问题中的示例代码所示。请参阅DataMemberAttribute、DataContractAttribute 和 DataContractSerializer -
@Nathan:我的意思是 XML 属性。
-
@John Saunders - 啊。我误解了。你见过lordzoltan.blogspot.com/2010/09/… 吗?不一定漂亮,但看起来您实际上可以将 xml 属性支持破解到其中。 (虽然我自己没有测试过)
标签: c# xml serialization collections datacontractserializer