Разница между использованием XMLRoot / XMLElement и использованием атрибутов Serializable () (в c #) - PullRequest
12 голосов
/ 20 ноября 2010

В чем разница между использованием XMLRoot / XMLElement и использованием атрибутов Serializable ()? Как я знаю, когда использовать каждый?

1 Ответ

30 голосов
/ 20 ноября 2010

Здесь приведено менее подробное описание, но я думаю, что это хорошая отправная точка.

XmlRootAttribute - используется для предоставления информации о схеме для класса, который будет корневым элементом сериализованного графа объектов. Это можно применять только к классам, структурам, перечислениям, интерфейсам возвращаемых значений.

XmlElementAttribute - Предоставляет информацию о схеме для свойств класса, управляющих тем, как они сериализуются как дочерние элементы. Этот атрибут может применяться только к полям (членам переменных класса), свойствам, параметрам и возвращаемым значениям.

Первые два XmlRootAttribute и XmlElementAttribute относятся к XmlSerializer. В то время как следующий, используется форматерами времени выполнения и не применяется при использовании XmlSerialization.

SerializableAtttrible - используется для указания того, что тип может быть сериализован средствами форматирования среды выполнения, такими как SoapFormatter или BinaryFormatter. Это требуется только в том случае, если вам нужно сериализовать тип с использованием одного из средств форматирования, и его можно применять к делегатам, перечислениям, структурам и классам.

Вот краткий пример, который может помочь прояснить вышесказанное.

// This is the root of the address book data graph
// but we want root written out using camel casing
// so we use XmlRoot to instruct the XmlSerializer
// to use the name 'addressBook' when reading/writing
// the XML data
[XmlRoot("addressBook")]
public class AddressBook
{
  // In this case a contact will represent the owner
  // of the address book. So we deciced to instruct
  // the serializer to write the contact details out
  // as <owner>
  [XmlElement("owner")]
  public Contact Owner;

  // Here we apply XmlElement to an array which will
  // instruct the XmlSerializer to read/write the array
  // items as direct child elements of the addressBook
  // element. Each element will be in the form of 
  // <contact ... />
  [XmlElement("contact")]
  public Contact[] Contacts;
}

public class Contact
{
  // Here we instruct the serializer to treat FirstName
  // as an xml element attribute rather than an element.
  // We also provide an alternate name for the attribute.
  [XmlAttribute("firstName")]
  public string FirstName;

  [XmlAttribute("lastName")]
  public string LastName;

  [XmlElement("tel1")]
  public string PhoneNumber;

  [XmlElement("email")]
  public string EmailAddress;
}

Учитывая вышеизложенное, экземпляр AddressBook, сериализованный с XmlSerializer, даст XML следующего формата

<addressBook>
  <owner firstName="Chris" lastName="Taylor">
    <tel1>555-321343</tel1>
    <email>chris@guesswhere.com</email>
  </owner>
  <contact firstName="Natasha" lastName="Taylor">
    <tel1>555-321343</tel1>
    <email>natasha@guesswhere.com</email>
  </contact>
  <contact firstName="Gideon" lastName="Becking">
    <tel1>555-123423</tel1>
    <email>gideon@guesswhere.com</email>
  </contact>
</addressBook>
...