Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何覆盖列表中每个列表项的序列化名称<;SomeStruct>;()在c#中?_C#_List_Struct_Generics_Xmlserializer - Fatal编程技术网

如何覆盖列表中每个列表项的序列化名称<;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(“客户”)]