2008-09-17 89 views
1

使用SOAP/XML序列化HashTable(或通過字符串索引器導航的數據)的最佳方式是什麼?爲SOAP/XML序列化HashTable的最佳方式是什麼?

比方說,我有一個Foo有一個屬性Bar[] Bars。 A Bar對象有一個鍵和一個值。默認情況下,這個序列化爲以下XML:

<Foo> 
    <Bars> 
    <Bar key="key0" value="value0"/> 
    ... 
    </Bars> 
</Foo> 

對於JSON,這個序列化爲:

{"Foo":["Bars":[{"Key":"key0","Value":"key1} ... ]}]} 

我真的很想擁有這是連載,以更好地反映基本關係。例如,

<Foo> 
    <Bars> 
    <Key0 value="value0"/> 
    <Key1 value="value1"/> 
    ... 
    </Bars> 
</Foo> 

我知道有與這種方式序列化到SOAP一些挑戰,但什麼是提供一個架構,更好地反映了這一點,最好的辦法?

我試着創建一個BarsCollection對象並定義了自定義序列化,但它似乎並沒有真正調用該對象的序列化。例如。

void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { 
    foreach (Bar bar in Bars){   
    info.AddValue(bar.Key. bar); 
    } 
} 

有什麼建議嗎?這裏最好的做法是什麼?

回答

1

我真的不認爲你想要什麼反映結構更好。爲了定義一個模式(想想XSD),你必須事先知道所有的潛在鍵,因爲你指出你想讓每個鍵都是一個單獨的自定義類型。從概念上來說,Bars將是一個持有Key0,Key1類型對象的對象數組,每個KeyN類都包含一個value屬性。我相信第一個系列化實際上是底層結構的最好反映。它「工作」的原因更像JSON中的想法,就是你失去了輸入 - 所有東西都只是一個對象。如果你不關心類型爲什麼不使用JSON?

+0

正確 - 這正是問題 - 可以有無數的鍵,不同的Foos可以有不同的集合,等等。顯然,在後端,我將它存儲爲數據庫中的一對多關係 - 我現在更關心的是使API直觀易用。 – tmarman 2008-09-18 21:24:58

+0

無論我如何實際存儲它們,我都希望API的使用者能夠使其具有語法上的優勢*看起來像一個具有屬性的對象。那有意義嗎? – tmarman 2008-09-18 21:25:39

0

ISerializable不用於xml序列化;它用於二進制序列化。你會更好地實現IXmlSerializable。

但我認爲KeyedCollection序列化更像你想的那樣。除了你永遠不會得到< key0 ... /> < key1 ... />因爲元素映射到類。

0

您可以在SOAP擴展中傳遞散列表。這樣,你可以按照你喜歡的方式序列化它。雖然有必須在客戶端和服務器上的自定義代碼。

+0

是的,我不控制消費者,所以我需要一些可以一般工作(和.NET平臺)的東西。 – tmarman 2008-09-18 21:23:01

0

我想你錯過了SOAP協議的基本關鍵。

我真正喜歡的SOAP協議之一是您可以在WSDL文件中定義任意對象(以及方法),並使用SOAP協議將這些對象從一端傳遞到另一端。您不必在一端序列化數據,然後在另一端反序列化數據。

相關問題