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;
}
는 백업 필드 때문에 같은 대답에 언급 된 기본 동작, 직렬화 속성 발생합니다 :
감사합니다 : 그것은 참조 참고로
해야한다. 두 속성을 모두 사용하면 어떤 문제가 발생할 수 있는지 자세히 설명해 줄 수 있습니까? XmlSerializer가 DataContract 특성을 무시하고 그 반대의 경우를 기대합니까? –
제 지식으로는 속성과 충돌이 없어야합니다. 하지만 두 개의 serializer는 참조, 기본값, 지원되는 유형, 공백 보존 등을 직렬화하는 것과 관련하여 매우 다른 동작을합니다. 추가 속성은 클래스를 정리할 수 있습니다.그러나 기술적으로 나는 어떤 갈등도 기대하지 않는다. – Josh
@Josh Einstein - [DataContract]로 표시된 C# 클래스의 결과는 클래스 정의에 [Serializable] 속성이있는 복합 유형, 즉 사용자 정의 객체를 갖고 있습니까? –