在原语列表上使用 DataContractSerializer 的自定义元素名称

Posted

技术标签:

【中文标题】在原语列表上使用 DataContractSerializer 的自定义元素名称【英文标题】:Custom Element Names using the DataContractSerializer on a List of primitives 【发布时间】:2011-07-27 21:03:54 【问题描述】:

我对在 DataContractSerializer 中使用基元列表时设置自定义元素名称的最佳方式感兴趣。假设我有以下类,其中包含作为 DataMember 的字符串列表。

[DataContract]
public class ClassName

    [DataMember]
    public List<String> FieldName  get; set; 

默认情况下,这会序列化为以下内容:

<ClassName xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <FieldName xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>Value 1</a:string>
    <a:string>Value 2</a:string>
    <a:string>Value 3</a:string>
  </FieldName>
</ClassName>

我想让 XML 尽可能简单地通过 XSLT 进行转换,所以理想情况下我会将标签重命名为更有用的东西,比如 Value。

一种可能的解决方案是创建一个扩展 Collection 的类并为 CollectionDataMember 参数设置 ItemName,我发现了 here。我想知道是否有一种方法可以在不需要这个额外的类或其他形式的包装类的情况下实现相同的目标。 XML 序列化程序使用 XMLArray 和 XMLArrayItem 参数来完成此操作,但 DataContractSerializer 似乎没有类似的功能。

感谢任何提示或想法!

【问题讨论】:

另一种选择可能是您创建一个名为“Value : String”的类,它继承自 System.String 并在 DataMember 中使用它... @NabheetSandhu System.String 已密封。你不能继承它。 【参考方案1】:

定义数据协定以表示字符串列表并将其用作您的 FieldName 属性的类型。然后你可以使用 CollectionDataContract 属性来自定义 XML。

[CollectionDataContract(ItemName="Value")]
public class MyList : List<string>  

[DataMember]
public MyList FieldName  get; set; 

【讨论】:

+1 - 我不知道该怎么做。但是,我最近需要这样做,并使用 svcutil 从 XSD 转到 DataContract。这几乎就是 svcutil 产生的。【参考方案2】:

您的选择有限。 DataContractSerializer 不是为生成漂亮的 XML 而设计的。它被 WCF 使用,它本质上对人眼不友好。因此,您最多可以做的是通过使用字符串属性定义自定义类型来最小化名称空间的使用和命名元素。

【讨论】:

以上是关于在原语列表上使用 DataContractSerializer 的自定义元素名称的主要内容,如果未能解决你的问题,请参考以下文章

线程应用程序上不同原语的 IPC 延迟

Java原语可以被视为轻对象吗?

OCaml 中占用 8 位的原语

为啥我们需要 asyncio 同步原语,何时使用这些原语?

如何同步缓存列表访问

域模型类是不是应该始终依赖于原语?