DataContractAttribute 클래스

정의

형식이 데이터 계약을 정의하거나 구현하며 DataContractSerializer같은 serializer에서 직렬화할 수 있도록 지정합니다. 형식을 직렬화할 수 있도록 하려면 형식 작성자가 해당 형식에 대한 데이터 계약을 정의해야 합니다.

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
특성

예제

다음 예제에서는 적용된 명명 PersonDataContractAttribute 된 클래스를 직렬화하고 역직렬화합니다. NamespaceName 속성은 기본 설정을 재정의하는 값으로 설정되었습니다.

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에 의해 직렬화 및 역직렬화 작업에 사용되는 형식(클래스, 구조 또는 열거형)에 적용합니다. WCF(Windows Communication Foundation) 인프라를 사용하여 메시지를 보내거나 받는 경우 메시지에서 보낸 데이터를 보관하고 조작하는 모든 클래스에도 적용 DataContractAttribute 해야 합니다. 데이터 계약에 대한 자세한 내용은 데이터 계약 사용을 참조하세요.

또한 직렬화하려는 값을 보유하는 필드, 속성, 또는 이벤트에 DataMemberAttribute를 적용해야 합니다. 이를 적용하여 DataContractAttribute데이터를 직렬화하고 역직렬화할 수 있도록 명시적으로 설정합니다 DataContractSerializer .

Caution

프라이빗 필드에 DataMemberAttribute를 적용할 수 있습니다. 필드에 의해 반환된 데이터(프라이빗인 경우에도)는 직렬화되고 역직렬화되므로 악의적인 사용자 또는 프로세스에서 보거나 가로챌 수 있습니다.

데이터 계약에 대한 자세한 내용은 데이터 계약 사용에 나열된 항목을 참조하세요.

데이터 계약

데이터 계약은 각 필드에 대한 이름 및 데이터 형식이 있는 필드 집합에 대한 추상 설명입니다. 데이터 계약은 서로 다른 플랫폼의 서비스가 상호 운용할 수 있도록 단일 구현 외부에 존재합니다. 서비스 간에 전달된 데이터가 동일한 계약을 준수하는 한 모든 서비스는 데이터를 처리할 수 있습니다. 이 처리를 느슨하게 결합된 시스템이라고도 합니다. 또한 데이터 계약은 애플리케이션에서 처리할 수 있도록 데이터를 배달하는 방법을 지정한다는 인터페이스와 비슷합니다. 예를 들어 데이터 계약은 "FirstName" 및 "LastName"이라는 두 개의 텍스트 필드가 있는 "Person"이라는 데이터 형식을 호출할 수 있습니다. 데이터 계약을 만들려면 클래스에 DataContractAttribute를 적용하고, serialize해야 하는 모든 필드나 속성에 DataMemberAttribute를 적용합니다. serialize될 때 데이터는 형식에 암시적으로 기본 제공되는 데이터 계약을 준수합니다.

Note

데이터 계약은 상속 동작의 실제 인터페이스와 크게 다릅니다. 인터페이스는 파생된 형식에 의해 상속됩니다. 기본 클래스에 DataContractAttribute 적용할 때 파생된 형식은 특성 또는 동작을 상속하지 않습니다. 그러나 파생 형식에 데이터 계약이 있는 경우 기본 클래스의 데이터 멤버가 serialize됩니다. 그러나 파생 클래스의 DataMemberAttribute 새 멤버에 적용하여 직렬화할 수 있도록 해야 합니다.

XML 스키마 문서 및 SvcUtil 도구

다른 서비스와 데이터를 교환하는 경우 데이터 계약을 설명해야 합니다. 현재 버전의 DataContractSerializer경우 XML 스키마를 사용하여 데이터 계약을 정의할 수 있습니다. (다른 형태의 메타데이터/설명은 동일한 용도로 사용할 수 있습니다.) 애플리케이션에서 XML 스키마를 만들려면 /dconly 명령줄 옵션과 함께 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)를 사용합니다. 도구에 대한 입력이 어셈블리인 경우 기본적으로 도구는 해당 어셈블리에 있는 모든 데이터 계약 형식을 정의하는 XML 스키마 집합을 생성합니다. 반대로 Svcutil.exe 도구를 사용하여 데이터 계약으로 표현할 수 있는 구문을 사용하는 XML 스키마의 요구 사항을 준수하는 Visual Basic 또는 C# 클래스 정의를 만들 수도 있습니다. 이 경우 /dconly 명령줄 옵션은 필요하지 않습니다.

Svcutil.exe 도구에 대한 입력이 XML 스키마인 경우 기본적으로 도구는 클래스 집합을 만듭니다. 이러한 클래스를 검사하면 DataContractAttribute 해당 클래스가 적용된 것을 확인할 수 있습니다. 이러한 클래스를 사용하여 다른 서비스와 교환해야 하는 데이터를 처리하는 새 애플리케이션을 만들 수 있습니다.

WSDL(Web Services Description Language) 문서를 반환하는 엔드포인트에 대해 도구를 실행하여 코드 및 구성을 자동으로 생성하여 WCF(Windows Communication Foundation) 클라이언트를 만들 수도 있습니다. 생성된 코드에는 .로 표시된 형식이 DataContractAttribute포함됩니다.

기존 형식 다시 사용

데이터 계약에는 안정적인 이름과 멤버 목록이라는 두 가지 기본 요구 사항이 있습니다. 안정적인 이름은 네임스페이스 URI(Uniform Resource Identifier)와 계약의 로컬 이름으로 구성됩니다. 기본적으로 클래스에 DataContractAttribute 적용하면 클래스 이름을 로컬 이름으로 사용하고 클래스의 네임스페이스(접두사로 접두사 "http://schemas.datacontract.org/2004/07/")를 네임스페이스 URI로 사용합니다. NameNamespace 속성을 설정하여 기본값을 재정의할 수 있습니다. 네임스페이스를 변경하려면 ContractNamespaceAttribute을 네임스페이스에 적용할 수 있습니다. 필요한 대로 데이터를 처리하지만 데이터 계약과 다른 네임스페이스 및 클래스 이름을 갖는 기존 형식이 있는 경우 이 기능을 사용합니다. 기본값을 재정의하여 기존 형식을 다시 사용하고 직렬화된 데이터가 데이터 계약을 준수하도록 할 수 있습니다.

Note

모든 코드에서 더 긴 DataContract단어 대신 단어를 DataContractAttribute 사용할 수 있습니다.

버전 관리

데이터 계약은 이후 버전의 자체도 수용할 수 있습니다. 즉, 계약의 이후 버전에 추가 데이터가 포함되어 있으면 해당 데이터가 저장되고 그대로 보낸 사람에게 반환됩니다. 이렇게 하려면 인터페이스를 구현합니다 IExtensibleDataObject .

버전 관리에 대한 자세한 내용은 데이터 계약 버전 관리를 참조하세요.

생성자

Name Description
DataContractAttribute()

DataContractAttribute 클래스의 새 인스턴스를 초기화합니다.

속성

Name Description
IsNameSetExplicitly

명시적으로 설정되었는지 여부를 Name 가져옵니다.

IsNamespaceSetExplicitly

명시적으로 설정되었는지 여부를 Namespace 가져옵니다.

IsReference

개체 참조 데이터를 유지할지 여부를 나타내는 값을 가져오거나 설정합니다.

IsReferenceSetExplicitly

명시적으로 설정되었는지 여부를 IsReference 가져옵니다.

Name

형식에 대한 데이터 계약의 이름을 가져오거나 설정합니다.

Namespace

형식에 대한 데이터 계약의 네임스페이스를 가져오거나 설정합니다.

TypeId

파생 클래스에서 구현되는 경우 이 Attribute대한 고유 식별자를 가져옵니다.

(다음에서 상속됨 Attribute)

메서드

Name Description
Equals(Object)

이 인스턴스가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.

(다음에서 상속됨 Attribute)
GetHashCode()

이 인스턴스의 해시 코드를 반환합니다.

(다음에서 상속됨 Attribute)
GetType()

현재 인스턴스의 Type 가져옵니다.

(다음에서 상속됨 Object)
IsDefaultAttribute()

파생 클래스에서 재정의되는 경우 이 인스턴스의 값이 파생 클래스의 기본값인지 여부를 나타냅니다.

(다음에서 상속됨 Attribute)
Match(Object)

파생 클래스에서 재정의되는 경우 이 인스턴스가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.

(다음에서 상속됨 Attribute)
MemberwiseClone()

현재 Object단순 복사본을 만듭니다.

(다음에서 상속됨 Object)
ToString()

현재 개체를 나타내는 문자열을 반환합니다.

(다음에서 상속됨 Object)

명시적 인터페이스 구현

Name Description
_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)

적용 대상

추가 정보