为SOAP / XML序列化HashTable的最佳方法是什么?
用SOAP / XML序列化HashTable(或者最好通过字符串索引器导航的数据)的最佳方法是什么?
假设我有一个具有属性Bar [] Bars
的Foo
。 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协议将这些对象从一端传递到另一端。我们不必在一端对数据进行序列化,然后在另一端对它进行反序列化。