为SOAP / XML序列化HashTable的最佳方法是什么?

时间:2020-03-06 14:19:25  来源:igfitidea点击:

用SOAP / XML序列化HashTable(或者最好通过字符串索引器导航的数据)的最佳方法是什么?

假设我有一个具有属性Bar [] BarsFoo。 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);
  }
}

有什么建议?这里的最佳做法是什么?

解决方案

ISerializable不用于xml序列化;它用于二进制序列化。我们最好实现IXmlSerializable。

但是我认为KeyedCollection更像我们想的那样进行序列化。除非我们永远不会得到<key0 ... /> <key1 ... />,因为元素映射到类。

我们可以在SOAP扩展中传递哈希表。这样,我们可以按照自己的方式序列化它。尽管为此必须在客户端和服务器上有自定义代码。

我真的不认为我们想要的内容更好地反映了结构。要为此定义一个架构(例如XSD),我们必须事先知道所有可能的键,因为我们表示希望每个键都是一个单独的自定义类型。从概念上讲,条形图是一个对象数组,其中包含Key0,Key1类型的对象,每个KeyN类都包含一个value属性。我相信,第一次序列化实际上是对底层结构的最好反映。它在JSON中更像我们想要的那样"工作"的原因是我们丢失了键入-所有内容都只是一个对象。如果我们不关心类型,为什么不只使用JSON?

我认为我们缺少SOAP协议的基本键。

我最喜欢SOAP协议的一件事是,我们可以在WSDL文件中定义任意对象(以及方法),然后使用SOAP协议将这些对象从一端传递到另一端。我们不必在一端对数据进行序列化,然后在另一端对它进行反序列化。