SOAP/XML 用に HashTable をシリアル化する最良の方法は何ですか?
-
01-07-2019 - |
質問
SOAP/XML を使用して HashTable (または文字列インデクサーを介してナビゲートされるデータ) をシリアル化する最善の方法は何ですか?
私が持っているとしましょう Foo
それはプロパティを持っています Bar[] Bars
. 。あ 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);
}
}
助言がありますか?ここでのベストプラクティスは何ですか?
解決
あなたが望むものが構造をより良く反映しているとは本当に思いません。このためのスキーマ (XSD を考えてください) を定義するには、それぞれを個別のカスタム タイプにすることを指定するため、潜在的なキーをすべて事前に知っておく必要があります。概念的には、Bars は Key0、Key1 型のオブジェクトを保持するオブジェクトの配列であり、各 KeyN クラスには value プロパティが含まれます。実際、最初の連載が根底にある構造を最もよく反映していると私は信じています。JSON で望むように「動作」する理由は、入力する必要がなくなるためです。すべては単なるオブジェクトです。型を気にしないのであれば、単に JSON を使用してみてはいかがでしょうか。
他のヒント
ISerializable は XML シリアル化には使用されません。バイナリのシリアル化に使用されます。IXmlSerializable を実装した方がよいでしょう。
しかし、KeyedCollection はあなたが考えているとおりにシリアル化すると思います。<key0 を取得できないことを除いて .../> <キー1 .../> 要素はクラスにマップされるためです。
SOAP 拡張機能でハッシュテーブルを渡すことができます。そうすれば、好きな方法でシリアル化できます。ただし、これにはクライアントとサーバー上に存在する必要があるカスタム コードがあります。
SOAP プロトコルの基本的なキーが欠けていると思います。
SOAP プロトコルについて私が特に気に入っている点の 1 つは、WSDL ファイル内で任意のオブジェクト (メソッドとともに) を定義し、SOAP プロトコルを使用してこれらのオブジェクトを一方の端からもう一方の端へ受け渡すことができることです。一方の側でデータをシリアル化し、もう一方の側でデータをシリアル化解除する必要はありません。