1

使用 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);
  }
}  

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

4

4 回答 4

1

我真的不认为你想要的东西能更好地反映结构。要为此定义一个模式(想想 XSD),您必须提前知道所有潜在的键,因为您表明您希望每个键都是单独的自定义类型。从概念上讲,Bars 是一个包含 Key0、Key1 类型对象的对象数组,每个 KeyN 类都包含一个 value 属性。我相信第一次序列化其实是对底层结构的最好体现。它“工作”更像你在 JSON 中想要的那样的原因是你失去了打字——一切都只是一个对象。如果您不关心类型,为什么不直接使用 JSON?

于 2008-09-18T00:25:39.803 回答
0

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

但我认为 KeyedCollection 的序列化更像您的想法。除了你永远不会得到 <key0 ... /> <key1 ... /> 因为元素映射到类。

于 2008-09-17T23:34:34.433 回答
0

您可以在 SOAP 扩展中传递哈希表。这样,您可以以任何您喜欢的方式对其进行序列化。尽管对此有自定义代码,但必须在客户端和服务器上。

于 2008-09-17T23:47:12.377 回答
0

我认为您缺少 SOAP 协议的基本密钥。

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

于 2008-09-18T13:46:10.550 回答