1

SOAP/XML を使用して HashTable (または文字列インデクサーを介してナビゲートするのが最適なデータ) をシリアル化する最良の方法は何ですか?

Fooプロパティを持つがあるとしましょうBar[] BarsBarオブジェクトにはキーと値があります。デフォルトでは、これは次の 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);
  }
}  

助言がありますか?ここでのベストプラクティスは何ですか?

4

4 に答える 4

1

あなたが望むものが構造をよりよく反映しているとは本当に思いません。このためのスキーマ (XSD を考えてください) を定義するには、潜在的なキーをすべて事前に知っておく必要があります。これは、各キーを個別のカスタム タイプにすることを示すためです。概念的には、Bars は Key0、Key1 型のオブジェクトを保持するオブジェクトの配列であり、それぞれの KeyN クラスに値のプロパティが含まれています。私は、最初の連載が実際には、根底にある構造を最もよく反映していると信じています。JSON で必要なように "機能" する理由は、型付けが失われるためです。すべてが単なるオブジェクトです。タイプを気にしないのであれば、なぜ JSON を使用しないのでしょうか?

于 2008-09-18T00:25:39.803 に答える
0

SOAP 拡張機能でハッシュテーブルを渡すことができます。そうすれば、好きな方法でシリアル化できます。これには、クライアントとサーバーに必要なカスタム コードがあります。

于 2008-09-17T23:47:12.377 に答える
0

ISerializable は xml シリアル化には使用されません。バイナリのシリアル化に使用されます。IXmlSerializable を実装したほうがよいでしょう。

しかし、KeyedCollection は、あなたが考えているようにシリアル化すると思います。ただし、要素はクラスにマップされるため、 <key0 ... /> <key1 ... /> を取得することはありません。

于 2008-09-17T23:34:34.433 に答える
0

SOAP プロトコルの基本的なキーが欠落していると思います。

SOAP プロトコルについて私が本当に気に入っている点の 1 つは、WSDL ファイルで任意のオブジェクトを (メソッドと共に) 定義し、SOAP プロトコルを使用してこれらのオブジェクトを端から端まで受け渡すことができることです。一方の端でデータをシリアル化し、もう一方の端でシリアル化を解除する必要はありません。

于 2008-09-18T13:46:10.550 に答える