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

时间:2008-09-17 23:28:57

标签: c# .net xml serialization

使用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对象并在其上定义自定义序列化,但它似乎并没有真正调用该对象的序列化。 E.g。

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

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

4 个答案:

答案 0 :(得分:1)

我真的不认为你想要的东西会更好地反映结构。要为此定义模式(想想XSD),您必须事先知道所有潜在的密钥,因为您指出您希望每个密钥都是单独的自定义类型。从概念上讲,Bars将是一个包含Key0,Key1类型对象的对象数组,每个KeyN类都包含一个value属性。我相信第一个序列化实际上是底层结构的最佳反映。它在JSON中更像“工作”的原因是你失去了输入 - 一切都只是一个对象。如果您不关心类型,为什么不只使用JSON?

答案 1 :(得分:0)

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

但我认为KeyedCollection序列化更像你在思考。除了你永远不会得到&lt; key0 ... /&gt; &lt; key1 ... /&gt;因为元素映射到类。

答案 2 :(得分:0)

您可以在SOAP扩展中传递哈希表。这样,您可以按照您希望的方式对其进行序列化。虽然有自定义代码,但必须在客户端和服务器上。

答案 3 :(得分:0)

我认为你错过了SOAP协议的基本密钥。

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