DataContractAttribute クラス

定義

この型が、データ コントラクトを定義または実装し、DataContractSerializer などのシリアライザーによってシリアル化可能であることを指定します。 型をシリアル化可能にするには、型作成者が、型のデータ コントラクトを定義する必要があります。

public ref class DataContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)]
public sealed class DataContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)>]
type DataContractAttribute = class
    inherit Attribute
Public NotInheritable Class DataContractAttribute
Inherits Attribute
継承
DataContractAttribute
属性

Person が適用された DataContractAttribute という名前のクラスをシリアル化および逆シリアル化する例を次に示します。 Namespace プロパティと Name プロパティに、既定の設定をオーバーライドするための値が設定されていることに注意してください。

namespace DataContractAttributeExample
{
    // Set the Name and Namespace properties to new values.
    [DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
    class Person : IExtensibleDataObject
    {
        // To implement the IExtensibleDataObject interface, you must also
        // implement the ExtensionData property.
        private ExtensionDataObject extensionDataObjectValue;
        public ExtensionDataObject ExtensionData
        {
            get
            {
                return extensionDataObjectValue;
            }
            set
            {
                extensionDataObjectValue = value;
            }
        }

        [DataMember(Name = "CustName")]
        internal string Name;

        [DataMember(Name = "CustID")]
        internal int ID;

        public Person(string newName, int newID)
        {
            Name = newName;
            ID = newID;
        }
    }

    class Test
    {
        public static void Main()
        {
            try
            {
                WriteObject("DataContractExample.xml");
                ReadObject("DataContractExample.xml");
                Console.WriteLine("Press Enter to end");
                Console.ReadLine();
            }
            catch (SerializationException se)
            {
                Console.WriteLine
                ("The serialization operation failed. Reason: {0}",
                  se.Message);
                Console.WriteLine(se.Data);
                Console.ReadLine();
            }
        }

        public static void WriteObject(string path)
        {
            // Create a new instance of the Person class and
            // serialize it to an XML file.
            Person p1 = new Person("Mary", 1);
            // Create a new instance of a StreamWriter
            // to read and write the data.
            FileStream fs = new FileStream(path,
            FileMode.Create);
            XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
            DataContractSerializer ser =
                new DataContractSerializer(typeof(Person));
            ser.WriteObject(writer, p1);
            Console.WriteLine("Finished writing object.");
            writer.Close();
            fs.Close();
        }
        public static void ReadObject(string path)
        {
            // Deserialize an instance of the Person class
            // from an XML file. First create an instance of the
            // XmlDictionaryReader.
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
            XmlDictionaryReader reader =
                XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());

            // Create the DataContractSerializer instance.
            DataContractSerializer ser =
                new DataContractSerializer(typeof(Person));

            // Deserialize the data and read it from the instance.
            Person newPerson = (Person)ser.ReadObject(reader);
            Console.WriteLine("Reading this object:");
            Console.WriteLine(String.Format("{0}, ID: {1}",
            newPerson.Name, newPerson.ID));
            fs.Close();
        }
    }
}
Namespace DataContractAttributeExample
    ' Set the Name and Namespace properties to new values.
    <DataContract(Name := "Customer", [Namespace] := "http://www.contoso.com")>  _
    Class Person
        Implements IExtensibleDataObject
        ' To implement the IExtensibleDataObject interface, you must also
        ' implement the ExtensionData property.
        Private extensionDataObjectValue As ExtensionDataObject 
        
        Public Property ExtensionData() As ExtensionDataObject _
          Implements IExtensibleDataObject.ExtensionData
            Get
                Return extensionDataObjectValue
            End Get
            Set
                extensionDataObjectValue = value
            End Set
        End Property
        
        <DataMember(Name := "CustName")>  _
        Friend Name As String
        
        <DataMember(Name := "CustID")>  _
        Friend ID As Integer
        
        
        Public Sub New(ByVal newName As String, ByVal newID As Integer) 
            Name = newName
            ID = newID
        
        End Sub 
    End Class 
    
    
    Class Test
        
        Public Shared Sub Main() 
            Try
                WriteObject("DataContractExample.xml")
                ReadObject("DataContractExample.xml")
                Console.WriteLine("Press Enter to end")
                Console.ReadLine()
            Catch se As SerializationException
                Console.WriteLine("The serialization operation failed. Reason: {0}", _
                   se.Message)
                Console.WriteLine(se.Data)
                Console.ReadLine()
            End Try
        
        End Sub 
        
        
        Public Shared Sub WriteObject(ByVal path As String) 
            ' Create a new instance of the Person class and 
            ' serialize it to an XML file.
            Dim p1 As New Person("Mary", 1)
            ' Create a new instance of a StreamWriter
            ' to read and write the data.
            Dim fs As New FileStream(path, FileMode.Create)
            Dim writer As XmlDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(fs)
            Dim ser As New DataContractSerializer(GetType(Person))
            ser.WriteObject(writer, p1)
            Console.WriteLine("Finished writing object.")
            writer.Close()
            fs.Close()
        
        End Sub 
        
        Public Shared Sub ReadObject(ByVal path As String) 
            ' Deserialize an instance of the Person class 
            ' from an XML file. First create an instance of the 
            ' XmlDictionaryReader.
            Dim fs As New FileStream(path, FileMode.OpenOrCreate)
            Dim reader As XmlDictionaryReader = XmlDictionaryReader. _
              CreateTextReader(fs, New XmlDictionaryReaderQuotas())
            
            ' Create the DataContractSerializer instance.
            Dim ser As New DataContractSerializer(GetType(Person))
            
            ' Deserialize the data and read it from the instance.
            Dim newPerson As Person = CType(ser.ReadObject(reader), Person)
            Console.WriteLine("Reading this object:")
            Console.WriteLine(String.Format("{0}, ID: {1}", newPerson.Name, newPerson.ID))
            fs.Close()
        
        End Sub 
    End Class 
End Namespace

注釈

DataContractAttribute によるシリアル化および逆シリアル化操作で使用される型 (クラス、構造体、または列挙) に対して、DataContractSerializer 属性を適用します。 Windows Communication Foundation (WCF) インフラストラクチャを使用してメッセージを送受信する場合は、 DataContractAttribute メッセージで送信されるデータを保持および操作するクラスにも適用する必要があります。 データ コントラクトの詳細については、「データ コントラクトの使用」を参照してください。

シリアル化する値を保持するフィールド、プロパティ、またはイベントにも、DataMemberAttribute を適用する必要があります。 DataContractAttribute の適用によって、DataContractSerializer によるデータのシリアル化と逆シリアル化を明示的に有効にします。

注意事項

プライベートなフィールドに対して DataMemberAttribute を適用できます。 フィールドによって返されるデータは (プライベートであっても) シリアル化と逆シリアル化の対象となるため、悪意のあるユーザーやプロセスによって傍受される可能性があることに注意してください。

データコントラクトの詳細については、「 データコントラクトの使用」に記載されているトピックを参照してください。

データ コントラクト

データコントラクト は、各フィールドの名前とデータ型を持つ一連のフィールドの抽象的な説明です。 データ コントラクトは、単一の実装の外部に存在することで、異なるプラットフォームでのサービスの相互運用を可能にします。 サービス間で渡されるデータが同一のコントラクトに準拠している限り、すべてのサービスがそのデータを処理できます。 この処理は、 疎結合システム とも呼ばれます。 データ コントラクトは、アプリケーションによる処理が可能なようにデータを伝送する方法を指定するという点でインターフェイスに似ています。 たとえば、"FirstName" と "LastName" という 2 つのテキスト フィールドがある "Person" という名前のデータ型をデータ コントラクトで呼び出すことができます。 データ コントラクトを作成するには、DataContractAttribute をクラスに適用し、シリアル化する必要がある任意のフィールドまたはプロパティに DataMemberAttribute を適用します。 データがシリアル化されるときに、データは、型に暗黙的に組み込まれたデータ コントラクトに従って処理されます。

注意

データ コントラクトは、継承動作の点で、実際のインターフェイスとは大きく異なります。 インターフェイスは、任意の派生する型によって継承されます。 DataContractAttribute を基本クラスに適用しても、派生する型は、属性も動作も継承しません。 ただし、派生する型にデータ コントラクトがある場合、基本クラスのデータ メンバーはシリアル化されます。 しかし、派生クラスの新しいメンバーをシリアル化可能にするには、新しいメンバーに対して DataMemberAttribute を適用する必要があります。

XML スキーマ ドキュメントと SvcUtil ツール

他のサービスとデータを交換する場合は、データ コントラクトを記述する必要があります。 DataContractSerializer の現在のバージョンでは、XML スキーマを使用してデータ コントラクトを定義できます (その他の形式のメタデータ/説明は、同じ目的で使用できます)。アプリケーションから XML スキーマを作成するには、 ServiceModel Metadata Utility Tool (Svcutil.exe)/dconly コマンドラインオプションを使用します。 ツールへの入力が既定ではアセンブリの場合、ツーは、そのアセンブリで検出されたすべてのデータ コントラクトの型を定義する XML スキーマ セットを生成します。 逆に、Svcutil.exe ツールは、データ コントラクトによって表現できる構造体を使用する XML スキーマの要件に適合する Visual Basic または C# クラスの定義を作成するために使用することもできます。 この場合、 /dconly コマンドラインオプションは必要ありません。

Svcutil.exe ツールへの入力が既定では XML スキーマの場合、ツールは、クラスのセットを作成します。 これらのクラスを確認すれば、DataContractAttribute が適用されていることがわかります。 これらのクラスを使用して、他のサービスと交換する必要があるデータを処理するための新しいアプリケーションを作成できます。

また、Web サービス記述言語 (WSDL) ドキュメントを返すエンドポイントに対してツールを実行して、コードと構成を自動的に生成し、Windows Communication Foundation (WCF) クライアントを作成することもできます。 生成されたコードには、DataContractAttribute でマークされた型が含まれます。

既存の型の再利用

データ コントラクトには、安定名とメンバー リストという 2 つの基本的な要件があります。 安定名は、名前空間の URI (uniform resource identifier) とコントラクトのローカル名で構成されます。 既定では、をクラスに適用すると、 DataContractAttribute クラス名がローカル名として使用され、クラスの名前空間 (プレフィックスは) が名前空間 URI として使用され "http://schemas.datacontract.org/2004/07/" ます。 Name プロパティと Namespace プロパティを設定することで、これらの既定値をオーバーライドできます。 ContractNamespaceAttribute を名前空間に適用することで、名前空間を変更することもできます。 この機能は、目的どおりにデータを処理する既存の型が存在するが、データ コントラクトの名前空間とクラス名が異なる場合に使用します。 既定値をオーバーライドすることで、既存の型を再利用しながら、シリアル化するデータをデータ コントラクトに準拠させることができます。

注意

コードでは、DataContract の代わりに DataContractAttribute という短い語を使用できます。

バージョン管理

データ コントラクトは、それ自体の新しいバージョンに対応できます。 つまり、コントラクトの次のバージョンに追加データが含まれている場合、そのデータは保存され、送信側にそのまま返送されます。 これを行うには、IExtensibleDataObject インターフェイスを実装します。

バージョン管理の詳細については、「 データコントラクトのバージョン管理」を参照してください。

コンストラクター

DataContractAttribute()

DataContractAttribute クラスの新しいインスタンスを初期化します。

プロパティ

IsNameSetExplicitly

Name が明示的に設定されているかどうかを取得します。

IsNamespaceSetExplicitly

Namespace が明示的に設定されているかどうかを取得します。

IsReference

オブジェクト参照データを保持するかどうかを示す値を取得または設定します。

IsReferenceSetExplicitly

IsReference が明示的に設定されているかどうかを取得します。

Name

型のデータ コントラクトの名前を取得または設定します。

Namespace

型のデータ コントラクトの名前空間を取得または設定します。

TypeId

派生クラスで実装されると、この Attribute の一意の識別子を取得します。

(継承元 Attribute)

メソッド

Equals(Object)

このインスタンスが、指定されたオブジェクトと等価であるかどうかを示す値を返します。

(継承元 Attribute)
GetHashCode()

このインスタンスのハッシュ コードを返します。

(継承元 Attribute)
GetType()

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

(継承元 Object)
IsDefaultAttribute()

派生クラスでオーバーライドされるとき、このインスタンスの値が派生クラスの既定値であるかどうかを示します。

(継承元 Attribute)
Match(Object)

派生クラス内でオーバーライドされたときに、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。

(継承元 Attribute)
MemberwiseClone()

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

(継承元 Object)
ToString()

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

(継承元 Object)

明示的なインターフェイスの実装

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

一連の名前を対応する一連のディスパッチ識別子に割り当てます。

(継承元 Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

オブジェクトの型情報を取得します。この情報はインターフェイスの型情報の取得に使用できます。

(継承元 Attribute)
_Attribute.GetTypeInfoCount(UInt32)

オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得します。

(継承元 Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

オブジェクトによって公開されたプロパティおよびメソッドへのアクセスを提供します。

(継承元 Attribute)

適用対象

こちらもご覧ください