DataContractAttribute クラス

定義

この型が、データ コントラクトを定義または実装し、DataContractSerializer などのシリアライザーによってシリアル化可能であることを指定します。Specifies that the type defines or implements a data contract and is serializable by a serializer, such as the DataContractSerializer. 型をシリアル化可能にするには、型作成者が、型のデータ コントラクトを定義する必要があります。To make their type serializable, type authors must define a data contract for their type.

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
type DataContractAttribute = class
    inherit Attribute
Public NotInheritable Class DataContractAttribute
Inherits Attribute
継承
DataContractAttribute
属性

Person が適用された DataContractAttribute という名前のクラスをシリアル化および逆シリアル化する例を次に示します。The following example serializes and deserializes a class named Person to which the DataContractAttribute has been applied. Namespace プロパティと Name プロパティに、既定の設定をオーバーライドするための値が設定されていることに注意してください。Note that the Namespace and Name properties have been set to values that override the default settings.

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 属性を適用します。Apply the DataContractAttribute attribute to types (classes, structures, or enumerations) that are used in serialization and deserialization operations by the DataContractSerializer. Windows Communication Foundation (WCF) インフラストラクチャを使用してメッセージを送受信する場合は、 DataContractAttributeメッセージで送信されるデータを保持および操作するクラスにも適用する必要があります。If you send or receive messages by using the Windows Communication Foundation (WCF) infrastructure, you should also apply the DataContractAttribute to any classes that hold and manipulate data sent in messages. データコントラクトの詳細については、「データコントラクトの使用」を参照してください。For more information about data contracts, see Using Data Contracts.

シリアル化する値を保持するフィールド、プロパティ、またはイベントにも、DataMemberAttribute を適用する必要があります。You must also apply the DataMemberAttribute to any field, property, or event that holds values you want to serialize. DataContractAttribute の適用によって、DataContractSerializer によるデータのシリアル化と逆シリアル化を明示的に有効にします。By applying the DataContractAttribute, you explicitly enable the DataContractSerializer to serialize and deserialize the data.

注意事項

プライベートなフィールドに対して DataMemberAttribute を適用できます。You can apply the DataMemberAttribute to private fields. フィールドによって返されるデータは (プライベートであっても) シリアル化と逆シリアル化の対象となるため、悪意のあるユーザーやプロセスによって傍受される可能性があることに注意してください。Be aware that the data returned by the field (even if it is private) is serialized and deserialized, and thus can be viewed or intercepted by a malicious user or process.

データコントラクトの詳細については、「データコントラクトの使用」に記載されているトピックを参照してください。For more information about data contracts, see the topics listed in Using Data Contracts.

データ コントラクトData Contracts

データコントラクトは、各フィールドの名前とデータ型を持つ一連のフィールドの抽象的な説明です。A data contract is an abstract description of a set of fields with a name and data type for each field. データ コントラクトは、単一の実装の外部に存在することで、異なるプラットフォームでのサービスの相互運用を可能にします。The data contract exists outside of any single implementation to allow services on different platforms to interoperate. サービス間で渡されるデータが同一のコントラクトに準拠している限り、すべてのサービスがそのデータを処理できます。As long as the data passed between the services conforms to the same contract, all the services can process the data. この処理は、疎結合システムとも呼ばれます。This processing is also known as a loosely coupled system. データ コントラクトは、アプリケーションによる処理が可能なようにデータを伝送する方法を指定するという点でインターフェイスに似ています。A data contract is also similar to an interface in that the contract specifies how data must be delivered so that it can be processed by an application. たとえば、"FirstName" と "LastName" という 2 つのテキスト フィールドがある "Person" という名前のデータ型をデータ コントラクトで呼び出すことができます。For example, the data contract may call for a data type named "Person" that has two text fields, named "FirstName" and "LastName". データ コントラクトを作成するには、DataContractAttribute をクラスに適用し、シリアル化する必要がある任意のフィールドまたはプロパティに DataMemberAttribute を適用します。To create a data contract, apply the DataContractAttribute to the class and apply the DataMemberAttribute to any fields or properties that must be serialized. データがシリアル化されるときに、データは、型に暗黙的に組み込まれたデータ コントラクトに従って処理されます。When serialized, the data conforms to the data contract that is implicitly built into the type.

注意

データ コントラクトは、継承動作の点で、実際のインターフェイスとは大きく異なります。A data contract differs significantly from an actual interface in its inheritance behavior. インターフェイスは、任意の派生する型によって継承されます。Interfaces are inherited by any derived types. DataContractAttribute を基本クラスに適用しても、派生する型は、属性も動作も継承しません。When you apply the DataContractAttribute to a base class, the derived types do not inherit the attribute or the behavior. ただし、派生する型にデータ コントラクトがある場合、基本クラスのデータ メンバーはシリアル化されます。However, if a derived type has a data contract, the data members of the base class are serialized. しかし、派生クラスの新しいメンバーをシリアル化可能にするには、新しいメンバーに対して DataMemberAttribute を適用する必要があります。However, you must apply the DataMemberAttribute to new members in a derived class to make them serializable.

XML スキーマ ドキュメントと SvcUtil ツールXML Schema Documents and the SvcUtil Tool

他のサービスとデータを交換する場合は、データ コントラクトを記述する必要があります。If you are exchanging data with other services, you must describe the data contract. DataContractSerializer の現在のバージョンでは、XML スキーマを使用してデータ コントラクトを定義できますFor the current version of the DataContractSerializer, an XML schema can be used to define data contracts. (同じ目的で、メタデータまたは記述形式を使用できます)。アプリケーションから XML スキーマを作成するには、 ServiceModel メタデータユーティリティツール (svcutil.exe)/dconlyコマンドラインオプションを使用します。(Other forms of metadata/description could be used for the same purpose.) To create an XML schema from your application, use the ServiceModel Metadata Utility Tool (Svcutil.exe) with the /dconly command line option. ツールへの入力が既定ではアセンブリの場合、ツーは、そのアセンブリで検出されたすべてのデータ コントラクトの型を定義する XML スキーマ セットを生成します。When the input to the tool is an assembly, by default, the tool generates a set of XML schemas that define all the data contract types found in that assembly. 逆に、Svcutil.exe ツールは、データ コントラクトによって表現できる構造体を使用する XML スキーマの要件に適合する Visual Basic または C# クラスの定義を作成するために使用することもできます。Conversely, you can also use the Svcutil.exe tool to create Visual Basic or C# class definitions that conform to the requirements of XML schemas that use constructs that can be expressed by data contracts. この場合、 /dconlyコマンドラインオプションは必要ありません。In this case, the /dconly command line option is not required.

Svcutil.exe ツールへの入力が既定では XML スキーマの場合、ツールは、クラスのセットを作成します。If the input to the Svcutil.exe tool is an XML schema, by default, the tool creates a set of classes. これらのクラスを確認すれば、DataContractAttribute が適用されていることがわかります。If you examine those classes, you find that the DataContractAttribute has been applied. これらのクラスを使用して、他のサービスと交換する必要があるデータを処理するための新しいアプリケーションを作成できます。You can use those classes to create a new application to process data that must be exchanged with other services.

また、Web サービス記述言語 (WSDL) ドキュメントを返すエンドポイントに対してツールを実行して、コードと構成を自動的に生成し、Windows Communication Foundation (WCF) クライアントを作成することもできます。You can also run the tool against an endpoint that returns a Web Services Description Language (WSDL) document to automatically generate the code and configuration to create an Windows Communication Foundation (WCF) client. 生成されたコードには、DataContractAttribute でマークされた型が含まれます。The generated code includes types that are marked with the DataContractAttribute.

既存の型の再利用Reusing Existing Types

データ コントラクトには、安定名とメンバー リストという 2 つの基本的な要件があります。A data contract has two basic requirements: a stable name and a list of members. 安定名は、名前空間の URI (uniform resource identifier) とコントラクトのローカル名で構成されます。The stable name consists of the namespace uniform resource identifier (URI) and the local name of the contract. 既定では、 DataContractAttributeをクラスに適用すると、クラス名がローカル名として使用され、クラスの名前空間 ( "http://schemas.datacontract.org/2004/07/"プレフィックスは) が名前空間 URI として使用されます。By default, when you apply the DataContractAttribute to a class, it uses the class name as the local name and the class's namespace (prefixed with "http://schemas.datacontract.org/2004/07/") as the namespace URI. Name プロパティと Namespace プロパティを設定することで、これらの既定値をオーバーライドできます。You can override the defaults by setting the Name and Namespace properties. ContractNamespaceAttribute を名前空間に適用することで、名前空間を変更することもできます。You can also change the namespace by applying the ContractNamespaceAttribute to the namespace. この機能は、目的どおりにデータを処理する既存の型が存在するが、データ コントラクトの名前空間とクラス名が異なる場合に使用します。Use this capability when you have an existing type that processes data exactly as you require but has a different namespace and class name from the data contract. 既定値をオーバーライドすることで、既存の型を再利用しながら、シリアル化するデータをデータ コントラクトに準拠させることができます。By overriding the default values, you can reuse your existing type and have the serialized data conform to the data contract.

注意

コードでは、DataContract の代わりに DataContractAttribute という短い語を使用できます。In any code, you can use the word DataContract instead of the longer DataContractAttribute.

バージョン管理Versioning

データ コントラクトは、それ自体の新しいバージョンに対応できます。A data contract can also accommodate later versions of itself. つまり、コントラクトの次のバージョンに追加データが含まれている場合、そのデータは保存され、送信側にそのまま返送されます。That is, when a later version of the contract includes extra data, that data is stored and returned to a sender untouched. これを行うには、IExtensibleDataObject インターフェイスを実装します。To do this, implement the IExtensibleDataObject interface.

バージョン管理の詳細については、「データコントラクトのバージョン管理」を参照してください。For more information about versioning, see Data Contract Versioning.

コンストラクター

DataContractAttribute()

DataContractAttribute クラスの新しいインスタンスを初期化します。Initializes a new instance of the DataContractAttribute class.

プロパティ

IsNameSetExplicitly

Name が明示的に設定されているかどうかを取得します。Gets whether Name has been explicitly set.

IsNamespaceSetExplicitly

Namespace が明示的に設定されているかどうかを取得します。Gets whether Namespace has been explicitly set.

IsReference

オブジェクト参照データを保持するかどうかを示す値を取得または設定します。Gets or sets a value that indicates whether to preserve object reference data.

IsReferenceSetExplicitly

IsReference が明示的に設定されているかどうかを取得します。Gets whether IsReference has been explicitly set.

Name

型のデータ コントラクトの名前を取得または設定します。Gets or sets the name of the data contract for the type.

Namespace

型のデータ コントラクトの名前空間を取得または設定します。Gets or sets the namespace for the data contract for the type.

TypeId

派生クラスで実装されると、この Attribute の一意の識別子を取得します。When implemented in a derived class, gets a unique identifier for this Attribute.

(継承元 Attribute)

メソッド

Equals(Object)

このインスタンスが、指定されたオブジェクトと等価であるかどうかを示す値を返します。Returns a value that indicates whether this instance is equal to a specified object.

(継承元 Attribute)
GetHashCode()

このインスタンスのハッシュ コードを返します。Returns the hash code for this instance.

(継承元 Attribute)
GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(継承元 Object)
IsDefaultAttribute()

派生クラスでオーバーライドされるとき、このインスタンスの値が派生クラスの既定値であるかどうかを示します。When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(継承元 Attribute)
Match(Object)

派生クラス内でオーバーライドされたときに、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(継承元 Attribute)
MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(継承元 Object)

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

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

一連の名前を対応する一連のディスパッチ識別子に割り当てます。Maps a set of names to a corresponding set of dispatch identifiers.

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

オブジェクトの型情報を取得します。この情報はインターフェイスの型情報の取得に使用できます。Retrieves the type information for an object, which can be used to get the type information for an interface.

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

オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得します。Retrieves the number of type information interfaces that an object provides (either 0 or 1).

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

オブジェクトによって公開されたプロパティおよびメソッドへのアクセスを提供します。Provides access to properties and methods exposed by an object.

(継承元 Attribute)

適用対象

こちらもご覧ください