如何覆盖列表中每个列表项的序列化名称<;SomeStruct>;()在c#中?
我有一个大致如下的结构:如何覆盖列表中每个列表项的序列化名称<;SomeStruct>;()在c#中?,c#,list,struct,generics,xmlserializer,C#,List,Struct,Generics,Xmlserializer,我有一个大致如下的结构: [Serializable] [XmlRoot("Customer")] public struct TCustomer { string CustomerNo; string Name; } 我有时将此结构作为单个对象序列化为XML,这很好,但有时还需要序列化此结构的列表 我已经使用它来设置顶级元素名称: [Serializable] [XmlRoot("Customers")] public class CustomerList : List<TCu
[Serializable]
[XmlRoot("Customer")]
public struct TCustomer
{
string CustomerNo;
string Name;
}
我有时将此结构作为单个对象序列化为XML,这很好,但有时还需要序列化此结构的列表
我已经使用它来设置顶级元素名称:
[Serializable]
[XmlRoot("Customers")]
public class CustomerList : List<TCustomer> { }
[可序列化]
[XmlRoot(“客户”)]
公共类CustomerList:列表{}
然而,XmlSerializer坚持调用每个列表项TCustomer。如何告诉XmlSerializer使用名称Customer而不是TCustomer?我从未在类/结构级别尝试过这一点,但当我需要序列化类中的列表时,我就是这样做的
[XmlArray("ConfigurationList")]
[XmlArrayItem("Configuration")]
private List<string> pConfigList = new List<string>();
[XmlArray(“配置列表”)]
[XmlArrayItem(“配置”)]
私有列表pConfigList=新列表();
您可以实现IXmlSerializable
以自定义某些对象的序列化方式:
无论如何,序列化程序似乎调用了TCustomer
项的类型,因为这是列表的实际类型(TCustomer
是???,其中???将是泛型参数类型TCustomer
的实际类型)
如果不实现IXmlSerializable
(我的意思是,避免序列化后的文本替换或其他什么!),我不会改变XmlSerializer
序列化对象的方式。希望这会有所帮助
[XmlType("Customer")]
[XmlRoot("Customer")]
public struct TCustomer
{
public string CustomerNo;
public string Name;
}
XmlRoot
属性仅适用于根元素,因此在序列化CustomerList
时,它不适用于TCustomer
如果不实现自己的序列化,我不认为您可以在CustomerList
类中将TCustomer
更改为Customer
进行序列化。但是你可以这样做
[Serializable]
[XmlRoot("customerList")]
public class CustomerList
{
[XmlArray("customers")]
[XmlArrayItem("customer")]
public List<TCustomer> Customers { get; set; }
}
[可序列化]
[XmlRoot(“客户列表”)]
公共类客户列表
{
[XmlArray(“客户”)]
[XmlArrayItem(“客户”)]
公共列表客户{get;set;}
}
这将为您提供类似以下内容的xml:
<customerList>
<customers>
<customer />
<customer />
<customer />
</customers>
</customerList>
这将更改通用列表中的CustomerList,但它允许您控制您的命名。感谢所有的答案。然而,我的具体问题的解决方案却非常简单:
[XmlRoot("Customers")]
public class Customers
{
[XmlElement("Customer")]
public List<TCustomer> List = new List<TCustomer>();
}
[XmlRoot(“客户”)]
公共类客户
{
[XmlElement(“客户”)]
公共列表=新列表();
}
不错!不过,如果您能够解释控制XmlSerializer序列化属性目标时生成的XML模式,那就太好了。-这更合适-初始化XmlTypeAttribute类的新实例并指定XML类型的名称。-+我喜欢这个!我不知道在复杂类型(如List
)中使用XmlType时,您可以用这种方式来控制名称,这正是我想要的!非常感谢。我还没有看到接受的答案也适用于序列化标准类型(如List MyList
)的项目名称的情况,但是这个答案足够灵活,可以在特定情况下处理重命名子标记名称的问题。另外,如果只需要重命名列表元素标记,我注意到实际上只需要[XmlArrayItem(“客户”)]