【问题标题】:What's the best way to serialize a HashTable for SOAP/XML?为 SOAP/XML 序列化 HashTable 的最佳方法是什么?
【发布时间】:2010-09-10 11:04:46
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net xml serialization


    【解决方案1】:

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

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

    【讨论】:

    • 我不太明白你在说什么。显然,我不必手动序列化,因为运行时正在为我做这些。我在这里构建一个 API,所以我的目标是让序列化的数据在消费者中默认看起来“更好”(我无法控制)。
    【解决方案2】:

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

    【讨论】:

    • 对 - 这正是问题所在 - 可以有无限数量的键,不同的 Foo 可以有不同的集合,等等。显然,在后端我将它存储为一对- 数据库中的许多关系 - 我现在更关心的是让 API 直观易用。
    • 不管我如何实际存储它们,我希望 API 的使用者能够拥有它的语法精巧看起来,就像一个具有属性的对象。这有意义吗?
    【解决方案3】:

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

    【讨论】:

    • 是的,我不控制消费者,所以我需要一些通用的东西(并且脱离 .NET 平台)。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2012-10-30
      • 2010-11-06
      相关资源
      最近更新 更多