Как я могу переопределить сериализованное имя каждого элемента списка в List <SomeStruct>() в c #? - PullRequest
5 голосов
/ 02 февраля 2011

У меня есть структура, более или менее такая:

[Serializable]
[XmlRoot("Customer")]
public struct TCustomer
{
  string CustomerNo;
  string Name;
}

Иногда я сериализирую эту структуру в XML как один объект, который прекрасно работает, но иногда мне также нужно сериализовать List <> этой структуры.

Я использовал это, чтобы установить имя элемента верхнего уровня:

[Serializable]
[XmlRoot("Customers")]
public class CustomerList : List<TCustomer> { }

Однако XmlSerializer настаивает на вызове каждого элемента списка TCustomer. Как я могу сказать XmlSerializer использовать имя Customer вместо TCustomer?

Ответы [ 5 ]

7 голосов
/ 02 февраля 2011

Надеюсь, это поможет

[XmlType("Customer")]
[XmlRoot("Customer")]
public struct TCustomer
{
    public string CustomerNo;
    public string Name;
}
5 голосов
/ 02 февраля 2011

Атрибут XmlRoot применяется только к корневому элементу, поэтому он не применяется к TCustomer при сериализации CustomerList.

Без реализации вашей собственной сериализации я не думаю, что вы можете изменить TCustomer на сериализацию как Customer в классе CustomerList. Но вы можете сделать что-то вроде этого ...

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

Это должно дать вам XML, похожий на:

<customerList>
   <customers>
      <customer />
      <customer />
      <customer />
   </customers>
</customerList>

Это изменяет ваш CustomerList из общего списка, но позволяет вам контролировать ваши имена.

2 голосов
/ 03 февраля 2011

Спасибо за все ответы. Однако решение моей конкретной проблемы оказалось таким простым:

[XmlRoot("Customers")]
public class Customers
{
    [XmlElement("Customer")]
    public List<TCustomer> List = new List<TCustomer>();
}
1 голос
/ 02 февраля 2011

Я никогда не пробовал этого на уровне класса / структуры, но именно так я делаю это, когда мне нужно сериализовать список внутри класса.

    [XmlArray("ConfigurationList")]
    [XmlArrayItem("Configuration")]
    private List<string> pConfigList = new List<string>();
0 голосов
/ 02 февраля 2011

Вы можете реализовать IXmlSerializable, чтобы настроить способ сериализации какого-либо объекта:

IXmlSerializable Interface

В любом случае, кажется, что сериализатор вызывает TCustomerтип элементов, потому что это фактический тип List (TCustomer равно ???, где ??? будет фактическим типом универсального типа параметра TCustomer).

Я бы не изменил способ XmlSerializer сериализации объектов без реализации IXmlSerializable (я имею в виду, избегайте пост-сериализованной замены текста или чего-либо еще!).

...