DataContract 및 DataMember 특성을 언제 사용합니까?


179

DataContractWCF 의 특성에 대해 매우 혼란 스럽습니다 . 내 지식에 따르면 클래스와 같은 사용자 정의 유형을 직렬화하는 데 사용됩니다. 나는 이런 식으로 클라이언트 측에 노출되는 클래스를 작성했습니다.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

그것은 제대로 작동하지만 때 제거 DataContract하고 DataMember또한 제대로 작동합니다. 왜 제대로 작동하는지 이해할 수 없습니다. 아무도 실제로 사용하는 것이 무엇인지 말해 줄 수 있습니까 DataContract?

내 서비스 계약은 다음과 같습니다

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}

답변:


361

.NET 3.5 SP1을 사용 하면 많은 프로그래머가 [DataContract]and [DataMember]특성에 압도 되었기 때문에 Microsoft는 데이터 계약 serializer가 해당 특성이 없어도 이전 XML serializer와 마찬가지로 모든 클래스를 처리하도록했습니다.

그래서 .NET 3.5 SP1의, 당신은하지 않습니다 에있다 데이터 계약 또는 데이터 구성원을 추가하는 것은 더 이상 속성 - 그렇게하지 않으면 다음 데이터 계약 시리얼 라이저는 클래스의 모든 공용 속성을 직렬화 할 것이다 단지 XML 시리얼 같은 것.

그러나 이러한 속성을 추가하지 않으면 유용한 기능이 많이 손실됩니다.

  • 이 없으면 [DataContract]데이터를 저장할 XML 네임 스페이스를 정의 할 수 없습니다.
  • 이 없으면 [DataMember]비공개 속성 또는 필드를 직렬화 할 수 없습니다.
  • 이없는 [DataMember]경우 직렬화 순서 ( Order=)를 정의 할 수 없으며 DCS는 모든 속성을 알파벳순으로 직렬화합니다.
  • 이 없으면 [DataMember]속성 ( Name=)에 다른 이름을 정의 할 수 없습니다
  • 없이는 [DataMember]유사 IsRequired=하거나 다른 유용한 속성을 정의 할 수 없습니다
  • 없이는 [DataMember]특정 공공 자산을 제외 할 수 없습니다. 모든 공공 자산은 DCS에 의해 일련 화됩니다.

따라서 "빠른 '더러운"솔루션의 경우 속성 [DataContract][DataMember]속성을 없애면 작동하지만 데이터 클래스에 포함시키는 것은 좋은 생각입니다. 당신이 그들없이 얻을 수없는 모든 추가 기능에 액세스 ...


기본적으로 모든 데이터 유형은 내부적으로 직렬화 가능으로 표시되어 있으며 DataContract / DataMember를 사용하여이를 제한했습니다.
santosh singh 12

2
@Santosh : 공개 속성이있는 클래스가있는 경우 명시 적으로 [DataContract] / [DataMember]를 적용하지 않으면 WCF 데이터 계약 시리얼 라이저에 의해 직렬화됩니다. 무엇을하지
marc_s

36
@Arthis : 그것은 사실이 아닙니다. .NET 3.5 SP1의로, WCF 것이다 행복하게 없이 직렬화 클래스 어떠한 [DataContract][DataMember]속성 ...하지만 바로 다음이 "기본"동작이 작동이 중지됩니다, 이러한 속성 중 하나를 사용하여 시작으로 - 곧 당신이 가지고있는 하나 [DataMember] 의 당신의 이 시점 부터이 속성을 가진 속성 직렬화됩니다.
marc_s

4
오! 그 점을 분명히 해주셔서 감사합니다! 나는 그것을 조금 더 파헤 치겠다!
Arthis

6
너! 그것은 바위! Merci beaucoup!
Arthis

16

WCF 측면에서 메시지를 통해 서버 및 클라이언트와 통신 할 수 있습니다. 메시지를 전송하고 보안을 위해 데이터 / 메시지를 직렬화 된 형식으로 만들어야합니다.

데이터를 직렬화하기 위해 [datacontract] 및 [datamember] 속성을 사용합니다. 귀하의 경우에는 당신이 사용하는 경우 datacontractWCF에서 사용하는 DataContractSerializer다른 WCF가 사용하는 XmlSerializer기본 직렬화 기술이다.

자세히 설명하겠습니다 :

기본적으로 WCF는 3 가지 유형의 직렬화를 지원합니다.

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer :-기본 순서는 클래스와 동일

DataContractSerializer / NetDataContractSerializer :-기본 순서는 알파벳순

XmlSerializer :-XML 스키마가 광범위하다

DataContractSerializer / NetDataContractSerializer :-XML 스키마가 제약 됨

XmlSerializer :-버전 관리 지원 불가

DataContractSerializer / NetDataContractSerializer : 버전 관리가 가능합니다

XmlSerializer : ASMX와의 호환성

DataContractSerializer / NetDataContractSerializer :-.NET Remoting과의 호환성

XmlSerializer : -XmlSerializer에 속성이 필요하지 않습니다

DataContractSerializer / NetDataContractSerializer :-이 직렬화에 필요한 속성

사용하는 것은 요구 사항에 따라 다릅니다.


8

데이터 계약은 교환 할 데이터를 추상적으로 설명하는 서비스와 클라이언트 간의 공식 계약입니다. 즉, 통신하기 위해 클라이언트와 서비스는 동일한 유형을 공유 할 필요는 없으며 동일한 데이터 계약 만 공유하면됩니다. 데이터 계약은 각 매개 변수 또는 리턴 유형에 대해 교환 할 직렬화 (XML로 변환 된) 데이터를 정확하게 정의합니다.

WCF (Windows Communication Foundation)는 기본적으로 Data Contract Serializer라는 직렬화 엔진을 사용하여 데이터를 직렬화 및 역 직렬화합니다 (XML과의 변환). 정수 및 문자열과 같은 모든 .NET Framework 기본 형식과 DateTime 및 XmlElement와 같은 기본 형식으로 처리되는 특정 형식은 다른 준비없이 직렬화 할 수 있으며 기본 데이터 계약이있는 것으로 간주됩니다. 많은 .NET Framework 유형에도 기존 데이터 계약이 있습니다.

전체 기사는 여기에서 찾을 수 있습니다 .


2
그것은 모두 진실하고 훌륭하지만 실제로 데이터 계약 직렬 변환기가 클래스의 [DataContract] 및 [DataMember] 속성없이 작동하는 이유에 대한 OP의 질문에 실제로 대답하지는 않습니다 ....
marc_s

누구든지 DataContract의 실제 사용이 무엇인지 말해 줄 수 있습니까? -질문의 적어도 일부 답변 된 것 같습니다.
IAbstract

2

데이터 계약은 교환 할 데이터를 추상적으로 설명하는 서비스와 클라이언트 간의 공식 계약입니다.

데이터 계약은 명시 적이거나 암시적일 수 있습니다. int, string 등과 같은 단순 유형에는 암시 적 데이터 계약이 있습니다. 사용자 정의 개체는 명시 적 또는 복합 형식이며 [DataContract] 및 [DataMember] 특성을 사용하여 데이터 계약을 정의해야합니다.

데이터 계약은 다음과 같이 정의 할 수 있습니다.

  • 서비스 작업과주고받는 외부 형식의 데이터를 설명합니다.

  • 서비스 메시지에서 교환되는 데이터의 구조와 유형을 정의합니다.

  • CLR 형식을 XML 스키마에 매핑합니다.
  • 데이터 형식이 직렬화 및 역 직렬화되는 방법을 정의합니다. 직렬화를 통해 객체를 네트워크를 통해 전송할 수있는 일련의 바이트로 변환합니다. 역 직렬화를 통해 호출 응용 프로그램에서받은 일련의 바이트에서 개체를 다시 어셈블합니다.
  • 구조화 된 데이터의 변경 사항을 관리 할 수있는 버전 관리 시스템입니다.

프로젝트에 System.Runtime.Serialization 참조를 포함시켜야합니다. 이 어셈블리에는 DataContract 및 DataMember 특성이 있습니다.


2
  1. 데이터 계약 : 엔티티 클래스가 직렬화 프로세스 준비가되었음을 지정합니다.

  2. 데이터 멤버 : 특정 필드가 데이터 계약의 일부이며 직렬화 될 수 있음을 지정합니다.


0

또한 http 요청에서 호출하면 제대로 작동하지만 net.tcp에서 호출하려고하면이 모든 종류의 물건을 얻습니다.


0

DataMember 특성은 데이터 직렬화에 추가 할 필요는 없습니다. DataMember 특성이 추가되지 않으면 이전 XMLSerializer가 데이터를 직렬화합니다. DataMember를 추가하면 순서, 이름, 필수 등의 유용한 속성이 제공되며, 그렇지 않으면 사용할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.