2011-12-29 135 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