15

XMLRoot / XMLElementの使用とSerializable()属性の使用の違いは何ですか?それぞれをいつ使用するかをどのように知ることができますか?

4

1 に答える 1

36

これは詳細な説明ではありませんが、良い出発点だと思います。

XmlRootAttribute- シリアル化されるオブジェクト グラフのルート要素になるクラスのスキーマ情報を提供するために使用されます。これは、戻り値のクラス、構造体、列挙型、インターフェイスにのみ適用できます。

XmlElementAttribute- 子要素としてシリアル化する方法を制御するクラスのプロパティのスキーマ情報を提供します。この属性は、フィールド (クラス変数メンバー)、プロパティ、パラメーター、および戻り値にのみ適用できます。

最初の 2 つのXmlRootAttributeXmlElementAttributeは、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;
}

上記の場合、XmlSerializer でシリアル化された AddressBook のインスタンスは、次の形式の 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>
于 2010-11-20T08:00:07.570 に答える