2009-05-05 3 views
2

DataContractSerializer를 사용하여 DataMember 특성으로 표시된 개체 속성과 필드를 xml로 serialize합니다.DataContractSerializer가 두 가지 방식으로 동일한 클래스를 직렬화하도록 하시겠습니까?

다른 속성과 다른 필드를 직렬화해야하는 동일한 클래스에 대해 다른 사용 사례가 있습니다.

다른 직렬화 시나리오에서 사용할 수있는 "또 다른 DataMemberAttribute"를 추가하는 방법이 있습니까?

+1

다른 속성과 필드를 serialize해야한다면 실제로는 같은 클래스가 아니라고 주장 할 수 있습니다. –

+0

나는 동의하지 않는다. 동일한 클래스가 다중 인터페이스를 구현하는 경우 특정 데이터 요소는 인터페이스 중 하나에만 관련 될 수 있습니다. – JohnOpincar

+0

인터페이스는 일련의 동작입니다. 직렬화되는 것은 상태입니다. 두 세트의 상태가 있다면 두 클래스가 있습니다. –

답변

2

아니요, 기본적으로.

기존 DataContractSerializer을 사용하려면 두 번째 버전의 DTO 클래스를 유지하고 두 번째 버전을 유지해야합니다.

옵션 당신은 당신의 자신의 직렬화 코드를 작성하는 경우 :

  • 자신의 [DataMember] 스타일 속성 (들)을 선언하고 자신의 직렬화 코드에서 런타임에 그 해석을
  • 는 "친구 클래스"
  • 를 사용 (a DSL 통해 IE)
  • 사용 코드 기반 구성 (예를 들면, 파일)
  • 사용 외부 메타

사실, 나는 첫 번째 것이 가장 간단한 선택 일 것이라고 기대한다.

+0

답장을 보내 주셔서 감사합니다! 내 자신의 serialization 코드를 작성하는 것은 옵션 일 수 있지만 실제로 어디서부터 시작해야할지 모르겠다. DataContractSurrogate를 사용하고 참조를 보존하고 있으며 DataContractSerializer의 동작을 "시뮬레이트"하는 데 약간의 노력이 필요하다. 기존 DataContractSerializer를 기반으로 하나를 작성하거나 이미 알고있는 비슷한 솔루션에 대한 링크가 있습니까? – asgerhallas

+0

직렬화 기술에 내장 된 전체 세트는 정말 놀림입니다. 그들은 당신이 그들과 함께 유용한 것을 시도 할 때까지 그들이 원하는 것을 바로 수행하는 것처럼 보입니다. 실제로 XAML 직렬화 형식을 선호합니다. 적어도 XML 기반의 개체 그래프 형식 인 것처럼 가장하기 때문입니다. –

+0

@Darrel Miller : XAML 직렬화 형식에 대한 포인터를 보내 주셔서 감사합니다. 나는 그것을 조사 할 것이다. – asgerhallas

0

할 방법이 있지만 추한 해킹입니다.

DataContractSerializerIXmlSerializable 인터페이스를 구현하는 개체를 serialize 할 수 있습니다. 인터페이스를 구현하고 객체를 다른 방식으로 직렬화 할 수있는 ReadXml(XmlReader reader)WriteXml(XmlWriter writer) 메서드를 만들 수 있습니다.

개체를 serialize하는 방법을 결정하려면 클래스 자체 내에 플래그가 있어야합니다. (DataContractSerializer에게 어떤 모드를 사용할 지 알려줄 방법이 없기 때문에 플래그는 객체 자체에 포함되어야합니다.)

@Marc에서 제시하는 DTO 클래스의 두 번째 버전은 훨씬 더 깨끗합니다.

1

이전과 비슷한 시나리오에서 Object Oriented 방식을 사용하여 주 클래스에서 확장 한 새 클래스를 만들었습니다. 는 같은 클래스가 여러 인터페이스를 구현하는 경우

는 특정 데이터 요소는 하나에 관련 될 수있는, KnownTypeAttribute 질문에 대한 귀하의 의견 중 하나에서

을 확인, 당신은 DataContractSerializer와 inhertience 달성하는 데 도움이 인터페이스의.

시나리오에 해당되는 경우 데이터 서비스 계약서가 클래스가 아닌 인터페이스 만 노출해야합니까?예를 들어

, 당신은 같은 클래스가있는 경우 : 다음

[DataContract] 
public class DataObject : IRed, IBlue 

을하기보다는 당신의 운영 계약이 데이터 객체에 노출이 두 가지 작업이 IRED에 대한 하나 IBlue 하나의 계약이있다. 이렇게하면 사용자 지정 serialization 코드가 필요하지 않습니다.

+0

나는 당신이 그 마지막 지점에 대해 매우 적절하다고 생각합니다. 유일한 단점은 대부분의 속성이 두 상황에서 직렬화되기 때문에 인터페이스에 속성의 중복 된 "선언"이 많이 있다는 것입니다. – asgerhallas

+0

아, 중복 선언은별로 중요하지 않습니다 ... 내 생각에 중복 코드 논리와 동일하지 않습니다. –

+0

동의합니다! 하지만 그것들을 동기화 상태로 유지하는 일은 지루한 일이지만 ... 물론 컴파일러는 물론 저를 도울 것입니다. 나는 그렇게 게으르지 않아야합니다. :) – asgerhallas

관련 문제