2011-12-29 75 views
3

我有下面的XML:XML DataContractDeserialization需要帮助

<?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字符串(一个响应)反序列化到一个对象中,并且我得到了两个属性的NULL(foo &酒吧)。

[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; } 
} 
+1

当遇到类似的问题在过去,我已经建立了一个尽可能接近xml定义的类,创建一个实例并使用给定的测试数据填充它,然后序列化它。 将结果与给定的xml输入进行比较并调整,直到它通过测试。然后,您应该能够反序列化到该类。我也很好奇,看看有没有更简单的方法。 – asawyer 2011-12-29 21:44:29

+0

你不能用'DataContractSerializer'来做你想做的事。它不使用属性。 – 2011-12-29 22:16:19

+0

@John Saunders - 实际上,DataContractSerializer确实使用属性,如问题中的示例代码所示。请参阅[DataMemberAttribute](http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datamemberattribute.aspx),[DataContractAttribute](http://msdn.microsoft.com/zh-cn/ library/system.runtime.serialization.datacontractattribute.aspx)和[DataContractSerializer](http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx) – Nathan 2011-12-29 22:34:02

回答

2

如果我正确理解的示例,则如下述(此答案预日期该澄清的DataContractSerializer是所期望的编辑)

。注意:其他属性没有任何伤害,但不被XmlSerializer使用 - 我只显示了XmlSerializer使用的属性。

[XmlRoot("Responses")] 
public class TxTNotifyResponse : DataContainer 
{ 
    [XmlArray("ResponseList")] 
    [XmlArrayItem("Response")] 
    public MsgResponseCollection MsgResponseList { get; set; } 
} 

public class MsgResponse : DataContainer 
{ 
    [XmlElement("Foo")] 
    public string Status { get; set; } 
    [XmlElement("Bar")] 
    public string MessageId { get; set; } 
} 

public class MsgResponseCollection : List<MsgResponse> 
{ 
} 

如果这不起作用(并且我没有测试过),请尝试使用单独的DTO模型。最简单的方法是把数据以XML文件(比如说,your.xml),并使用(在命令提示符):

xsd.exe your.xml 
xsd.exe your.xsd /classes 

哪会写your.cs

+0

这是一个很好的回应,但我想我在使用XML序列化器发布时犯了错误。我有一个XML字符串和使用的DataContractSerializer,它的工作原理是这样的... \t \t公共牛逼的readObject(字符串objectString) \t \t { \t \t \t VAR的MemoryStream =新的MemoryStream(_encoding.GetBytes(objectString)); \t \t \t var reader = XmlDictionaryReader。CreateTextReader(memoryStream,new XmlDictionaryReaderQuotas()); \t \t \t var serializer = new DataContractSerializer(typeof(T)); \t \t \t var obj =(T)serializer.ReadObject(reader,true); \t \t \t reader.Close(); \t \t \t return obj; \t \t} – Todd 2011-12-29 22:16:51

+0

@Todd - 我不清楚你的问题实际上是什么。您的评论中的代码不包含在您的问题中。但是,您的代码显示您正在调用DataContractSerializer的反序列化方法('ReadObject(...)')。这是否给你不正确的结果?例外?你要问的是什么问题? – Nathan 2011-12-29 22:42:13

+0

@Todd DataContractSerializer不允许对XML进行相同的细粒度控制。我的建议是:如果XML布局很重要:使用XmlSerializer。 – 2011-12-29 23:00:57