2010-07-20 2 views
2

[Serializable] 특성을 사용하는 기존 클래스 집합이 있습니다. 나는 그들을 WCF 서비스에 노출시켜야하고 그래서 그들에게 [DataContract] 속성이 필요하다. 그것은 Serializable과 함께 작동하지만 속성은 재미있는 이름을 얻습니다 ... k__BackingField.[Serializable]을 [DataContract]로 변경

이 클래스는 다른 곳에서도 사용되며 속성을 바꾸어서 위험 요소가 있는지 여부를 궁금해합니다. 또한, 둘 다 가질 수있는 좋은 생각입니까?

감사합니다.

답변

5

DataContractAttribute를 지정했지만 포함 할 멤버를 구체적으로 지정하지 않은 경우 기본 비헤이비어는 클래스의 모든 필드 (비공개 필드 포함)를 serialize하는 것입니다. 따라서 자동으로 구현 된 속성을 사용하고 있기 때문에 얻는 이름이 있습니다.

즉, 다음과 같이 클래스 정의를 변경하십시오. 직렬화하려는 속성의 DataMember 특성에 유의하십시오.

[DataContract] 
public class MyClass { 

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

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

    public string DontSerializeThis { 
     get; 
     set; 
    } 

} 

이는 DataContractSerializer가 속성이 아니라 자신의 컴파일러가 생성 한 백업 필드를 직렬화하게됩니다. 그러나 직렬화 된 데이터를 가져오고 설정하기 위해 이러한 속성 접근자를 거치므로 속성의 읽기/쓰기 공용 속성이 필요합니다.

다른 옵션은 자동 구현 된 속성을 "기본"속성 (자신의 배경 필드 추가)으로 변경하는 것입니다. 그런 다음 모든 DataMember 특성을 그대로 둘 수 있습니다. 즉, 모두 직렬화됨을 의미합니다. 또는 원하는 경우 직렬화 된 출력에서 ​​이름을 변경할 수 있도록 DataMember 특성을 새로 만든 필드에 추가 할 수 있습니다.

마지막으로 두 시스템 모두에서 클래스를 직렬화 가능하게 만드는 것이 좋은지에 관해서는 실제로는 그렇지 않습니다. BinaryFormatter 또는 XmlSerializer와 같은 클래스를 사용하여 클래스를 표준 직렬화에 참여 시키려면 DataContractSerializer가 이미이 클래스를 serialize 할 수 있으므로이 시나리오를 대상으로해야합니다.

목표가 빠르고 효율적이며 .NET 3+에서 .NET 3+ (또는 Silverlight) 통신 인 경우 DataContract를 사용하는 것이 좋습니다. XML represenation에 대한 상호 운용성 및/또는 제어가 목표 인 경우 XML 직렬화 특성을 고수하십시오.

public string DontSerializeThis { 
    get; 
    set; 
} 

는 백업 필드 때문에 같은 대답에 언급 된 기본 동작, 직렬화 속성 발생합니다 :

+0

감사합니다 : 그것은 참조 참고로

[IgnoreDataMember] public string DontSerializeThis { get; set; } 

해야한다. 두 속성을 모두 사용하면 어떤 문제가 발생할 수 있는지 자세히 설명해 줄 수 있습니까? XmlSerializer가 DataContract 특성을 무시하고 그 반대의 경우를 기대합니까? –

+0

제 지식으로는 속성과 충돌이 없어야합니다. 하지만 두 개의 serializer는 참조, 기본값, 지원되는 유형, 공백 보존 등을 직렬화하는 것과 관련하여 매우 다른 동작을합니다. 추가 속성은 클래스를 정리할 수 있습니다.그러나 기술적으로 나는 어떤 갈등도 기대하지 않는다. – Josh

+0

@Josh Einstein - [DataContract]로 표시된 C# 클래스의 결과는 클래스 정의에 [Serializable] 속성이있는 복합 유형, 즉 사용자 정의 객체를 갖고 있습니까? –

관련 문제