2016-02-27 116 views
2

我的目標是鬆散地連接兩個使用XML數據傳輸的應用程序。XML反序列化到不同的類?

我可以很容易地以XML格式進行序列化和反序列化。 但是,我可以從App1中的課程序列化,並在App2的不同課程中反序列化(與原始結構相同)?

C#或VB,沒關係。在VB結構示例:

應用1:

Namespace Transmitter 

    <DataContract> 
    Public Class DataOut 
     <DataMember> 
     Public Header As String 
     <DataMember> 
     Public Content As String 
    End Class 

End Namespace 

應用2:

Namespace Receiver 

    <DataContract> 
    Public Class DataIn ' structure actually matches Transmitter.DataOut from App1 
     <DataMember> 
     Public Header As String 
     <DataMember> 
     Public Content As String 
    End Class 

End Namespace 

App1,我可以序列化的Transmitter.DataOut實例轉換成XML,但我怎麼能閱讀所產生的XML中App2納入Receiver.DataIn的實例?我是否需要在App2中實施Transmitter.DataOut?或者可以這樣(我同意很多次有用)功能可以解決嗎? 我不想被共享相同的類名限制。

我在how-to(「它是否可行嗎?」)中不一定在源代碼中進行了討論。如果需要,我可以發佈我的源代碼,但它非常標準,使用DataContractSerializer

回答

2

是的,你可以這樣做。所有必須匹配的是數據契約,而不是底層的.Net類型。從Data Contract Equivalence

對於客戶端成功地發送某一類型的數據到服務或服務成功地將數據發送到客戶端,發送的類型並不一定要在接收端存在。唯一的要求是兩種類型的數據合同是等價的。 (有時,不需要嚴格等效,如Data Contract Versioning中所討論的那樣)。

對於數據合同是等價的,它們必須具有相同的名稱空間和名稱。另外,一方的每個數據成員必須在另一方具有等同的數據成員。

對於數據成員是等價的,它們必須具有相同的名稱。另外,它們必須表示相同類型的數據;也就是說,他們的數據合同必須是等價的。

基於合同的序列化程序的基本優勢之一是它不要求基礎類型相同。這允許實現獨立於線路格式,並且還可以是enables communication between completely different architectures-包括例如Java and .NET

您需要明確設置data contract namespacename是在兩個系統中相同的,例如:

<Assembly:ContractNamespaceAttribute("http://www.MyNameSpace.com", ClrNamespace:="Transmitter")> 

Namespace Transmitter 

    <DataContract(Name:= "Data", [Namespace]:="http://www.MyNameSpace.com")> _ 
    Public Class DataOut 
     <DataMember> 
     Public Header As String 
     <DataMember> 
     Public Content As String 
    End Class 

End Namespace 

或者,您可以使用ContractNamespaceAttribute設置的命名空間爲整個組件

更多信息,請參見Data Contract Names

也請注意,DataContractSerializerorder sensitive所以合同中成員的順序必須匹配。

+0

這是一個很好的解釋。感謝您展示如何理解和完成這件事。 (昨天和今天,我花了很多不成功的時間學習和嘗試。) – miroxlav