如何在c#中的List <SomeStruct>()中覆盖每个列表项的序列化名称?

Tho*_*nes 5 c# generics struct list xmlserializer

我有一个或多或少像这样的结构:

[Serializable]
[XmlRoot("Customer")]
public struct TCustomer
{
  string CustomerNo;
  string Name;
}
Run Code Online (Sandbox Code Playgroud)

我有时将此结构序列化为XML作为单个对象,它工作正常,但我有时也需要序列化此结构的List <>.

我用它来设置顶级元素名称:

[Serializable]
[XmlRoot("Customers")]
public class CustomerList : List<TCustomer> { }
Run Code Online (Sandbox Code Playgroud)

但是,XmlSerializer坚持要调用每个列表项TCustomer.如何告诉XmlSerializer使用Customer而不是TCustomer?

Anu*_*raj 7

希望能帮助到你

[XmlType("Customer")]
[XmlRoot("Customer")]
public struct TCustomer
{
    public string CustomerNo;
    public string Name;
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*cer 5

XmlRoot属性仅适用于根元素,因此TCustomer在序列化时不适用CustomerList.

如果没有实现自己的序列化,我认为您不能TCustomerCustomerCustomerList类中那样更改为序列化.但你可以这样做......

[Serializable]
[XmlRoot("customerList")]
public class CustomerList 
{
    [XmlArray("customers")]
    [XmlArrayItem("customer")]
    public List<TCustomer> Customers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这应该给你xml类似于:

<customerList>
   <customers>
      <customer />
      <customer />
      <customer />
   </customers>
</customerList>
Run Code Online (Sandbox Code Playgroud)

这会将您的CustomerList从通用列表中更改,但它允许您控制命名.


Tho*_*nes 2

感谢所有的答案。然而,我的具体问题的解决方案却很简单:

[XmlRoot("Customers")]
public class Customers
{
    [XmlElement("Customer")]
    public List<TCustomer> List = new List<TCustomer>();
}
Run Code Online (Sandbox Code Playgroud)