使用 DataContractSerializer 时与 XmlArrayItem 等效的是啥? [复制]

Posted

技术标签:

【中文标题】使用 DataContractSerializer 时与 XmlArrayItem 等效的是啥? [复制]【英文标题】:What is the equivalent to XmlArrayItem when using DataContractSerializer? [duplicate]使用 DataContractSerializer 时与 XmlArrayItem 等效的是什么? [复制] 【发布时间】:2021-02-28 22:01:45 【问题描述】:

我正在使用 DataContractSerializer 序列化具有 List 类型属性的对象,并且我想控制字符串的发出方式。

[DataContract(Name = "ReportData", Namespace = "")]
public class Foo

    [DataMember]
    public List<string> TrackingNumbers  get; set; 

当我序列化这个对象时,我得到了这个 XML:

<ReportData xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <TrackingNumbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>14735ec8-81c4-44e4-9bbe-6c661eb74e54</a:string>
  </TrackingNumbers>
</ReportData>

我想要的是:

<ReportData xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <TrackingNumbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <TrackingNumber>14735ec8-81c4-44e4-9bbe-6c661eb74e54</TrackingNumber>
  </TrackingNumbers>
</ReportData>

这可以通过 DataContractSerializer 实现吗?这对 XmlSerializer 和 XmlArrayItem 来说是微不足道的,但我无法弄清楚。

另外,是否可以生成不包含任何命名空间声明的 XML?

非常感谢。

【问题讨论】:

你可以继承List&lt;string&gt;并应用[CollectionDataContract(ItemName="TrackingNumber", Namespace = "")]。请参阅:Custom Element Names using the DataContractSerializer on a List of primitives 和 How to Deserialize XML using DataContractSerializer。 非常感谢@dbc,成功了 【参考方案1】:

这对我有用。这或多或少正是@dbc 所建议的:)

[CollectionDataContract(Namespace = "", ItemName = "TrackingNumber")]
internal class TrackingNumbersList : List<string>
 
    
[DataContract(Name = "ReportData", Namespace = "")]
public class Foo

    [DataMember]
    public TrackingNumbersList  TrackingNumbers  get; set; 

【讨论】:

以上是关于使用 DataContractSerializer 时与 XmlArrayItem 等效的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 DataContractSerializer 时设置属性的初始值

使用 DataContractSerializer 和 XmlDictionaryWriter 序列化 JObject 后崩溃

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

使用 DataContractSerializer 的接口中的显式类型

使用 DataContractSerializer 序列化没有命名空间的对象

如何使用 DataContractSerializer 从 XMLDocument 的单个节点反序列化?