自定义元素名称使用基元列表上的DataContractSerializer

med*_*g15 10 c# wcf xml-serialization datacontract datacontractserializer

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

[DataContract]
public class ClassName
{
    [DataMember]
    public List<String> FieldName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的任何提示或想法!

Ser*_*gey 7

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

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

[DataMember]
public MyList FieldName { get; set; }
Run Code Online (Sandbox Code Playgroud)


Sch*_*999 0

你的选择是有限的。DataContractSerializer 的设计初衷并不是为了生成漂亮的 XML。它由 WCF 使用,本质上对人眼不友好。因此,您最多可以做的是通过使用字符串属性定义自定义类型来最大程度地减少命名空间的使用和名称元素。