英語で読む

次の方法で共有


ExtensionDataObject クラス

定義

新しいメンバーの追加によって拡張された、バージョン付きのデータ コントラクトのデータを格納します。

C#
public sealed class ExtensionDataObject
継承
ExtensionDataObject

次のコードは、シリアル化可能な型 (PersonVersion2) の第 2 のバージョンである型 (Person) のインスタンスをシリアル化します。 第 2 のバージョンは、第 1 のバージョンにない追加データ (ID フィールド) を含みます。 このコードは、XML ドキュメントを Person オブジェクトに逆シリアル化し、その直後に追加データを含むオブジェクトを再シリアル化します。 このコードは、最後に新しい XML を PersonVersion2 オブジェクトに逆シリアル化し、完全なデータをコンソールに書き込みます。これは、データが型の古いバージョンとのラウンドトリップを終了していることを条件とします。 DataContractAttribute 属性は、Name プロパティと Namespace プロパティに元のクラスと同じ名前と名前空間を設定して適用する必要があることに注意してください。

C#
using System;
using System.Xml;
using System.Runtime.Serialization;
using System.IO;

// Implement the IExtensibleDataObject interface
// to store the extra data for future versions.
[DataContract(
    Name = "Person",
    Namespace = "http://www.cohowinery.com/employees")]
class Person : IExtensibleDataObject
{
    // To implement the IExtensibleDataObject interface,
    // you must implement the ExtensionData property. The property
    // holds data from future versions of the class for backward
    // compatibility.
    private ExtensionDataObject extensionDataObject_value;
    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionDataObject_value;
        }
        set
        {
            extensionDataObject_value = value;
        }
    }
    [DataMember]
    public string Name;
}

// The second version of the class adds a new field. The field's
// data is stored in the ExtensionDataObject field of
// the first version (Person). You must also set the Name property
// of the DataContractAttribute to match the first version.
// If necessary, also set the Namespace property so that the
// name of the contracts is the same.
[DataContract(Name = "Person",
    Namespace = "http://www.cohowinery.com/employees")]
class PersonVersion2 : IExtensibleDataObject
{
    // Best practice: add an Order number to new members.
    [DataMember(Order=2)]
    public int ID;

    [DataMember]
    public string Name;

    private ExtensionDataObject extensionDataObject_value;
    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionDataObject_value;
        }
        set
        {
            extensionDataObject_value = value;
        }
    }
}
public sealed class Program
{
    private Program()
    {
        // Private constructor to prevent creation of this class.
    }

    public static void Main()
    {
        try
        {
            WriteVersion2("V2.xml");
            WriteToVersion1("v2.xml");
            ReadVersion2("v2.xml");
        }
        catch (SerializationException exc)
        {
            Console.WriteLine("{0}: {1}", exc.Message, exc.StackTrace);
        }
        finally
        {
            Console.ReadLine();
        }
    }

    // Create an instance of the version 2.0 class. It has
    // extra data (ID field) that version 1.0 does
    // not understand.
    static void WriteVersion2(string path)
    {
        Console.WriteLine("Creating a version 2 object");
        PersonVersion2 p2 = new PersonVersion2();
        p2.Name = "Elizabeth";
        p2.ID = 2006;

        Console.WriteLine("Object data includes an ID");
        Console.WriteLine("\t Name: {0}", p2.Name);
        Console.WriteLine("\t ID: {0} \n", p2.ID);
        // Create an instance of the DataContractSerializer.
        DataContractSerializer ser =
            new DataContractSerializer(typeof(PersonVersion2));

        Console.WriteLine("Serializing the v2 object to a file. \n\n");
        FileStream fs = new FileStream(path, FileMode.Create);
        ser.WriteObject(fs, p2);
        fs.Close();
    }

    // Deserialize version 2 data to a version 1 object.
    static void WriteToVersion1(string path)
    {
        // Create the serializer using the version 1 type.
        DataContractSerializer ser =
            new DataContractSerializer(typeof(Person));

        FileStream fs = new FileStream(path, FileMode.Open);
        XmlDictionaryReader reader =
           XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
        Console.WriteLine
            ("Deserializing v2 data to v1 object. \n\n");

        Person p1 = (Person)ser.ReadObject(reader, false);

        Console.WriteLine("V1 data has only a Name field.");
        Console.WriteLine("But the v2 data is stored in the ");
        Console.WriteLine("ExtensionData property. \n\n");
        Console.WriteLine("\t Name: {0} \n", p1.Name);

        fs.Close();

        // Change data in the object.
        p1.Name = "John";
        Console.WriteLine("Changed the Name value to 'John' ");
        Console.Write("and reserializing the object to version 2 \n\n");
        // Reserialize the object.
        fs = new FileStream(path, FileMode.Create);
        ser.WriteObject(fs, p1);
        fs.Close();
    }

    // Deserialize a version 2.0 object.
    public static void ReadVersion2(string path)
    {
        FileStream fs = new FileStream(path, FileMode.Open);
        DataContractSerializer ser = new DataContractSerializer(typeof(PersonVersion2));

        Console.WriteLine("Deserializing new data to version 2 \n\n");
        PersonVersion2 p2 = (PersonVersion2)ser.ReadObject(fs);
        fs.Close();

        Console.WriteLine("The data includes the old ID field value. \n");
        Console.WriteLine("\t (New) Name: {0}", p2.Name);
        Console.WriteLine("\t ID: {0} \n", p2.ID);
    }
}

注釈

ExtensionDataObject は、XmlObjectSerializer によって逆シリアル化操作の間に検出された追加データを格納する構造体です。 この構造体は、シリアル化されたインスタンスに追加データを書き込むためにシリアル化で使用されます。 この構造体は、ExtensionData インターフェイスの IExtensibleDataObject プロパティによって返されます。

メソッド

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象

製品 バージョン
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

こちらもご覧ください