2008-09-11 3 views
3

우리는 많은 다른 방법 (모드)으로 직렬화 및 역 직렬화해야하는 다소 큰 개체 그래프가 있습니다. 일부 모드에서는 특정 속성을 deserialize하고 일부 속성은 deserialize하지 않기를 원합니다. 미래의 모드에서는 예 또는 아니오보다 속성에 대한 옵션이 더 많을 수도 있습니다. 문제는 이제 우리가 이러한 모드를 구현하는 방법입니다..NET 직렬화 클래스 디자인 문제

접근법 A (사용 직렬화 생성자 및 ISerializable.GetObjectData) :

우리는 우리가 직렬화의 모든 다른 모드에 대한 많은 스위치를 얻을 직렬화 생성자를 사용하여 그래프 직렬화 자체의 각 개체를 할 경우. 그러나이 방법의 장점은 모든 deserialization 논리가 한 위치에 있고 새 속성을 추가하면 ISerializable.GetObjectData 및 deserialization 생성자를 수정하기 만하면된다는 것입니다. 또 다른 장점은 객체가 공개적으로 노출 될 수있는 내부 상태를 고려할 수 있다는 것입니다. 가장 중요한 단점은 데이터 객체 자체가 가능한 모든 직렬화 모드에 대해 알아야한다는 것입니다. 새로운 모드가 필요한 경우 데이터 객체를 수정해야합니다.

접근 B (역 직렬화 공장 클래스/메소드) :

또 다른 방법은 어떤 종류의 역 직렬화 공장 수업을하는 것입니다/직렬화를 수행하고 외부에서 역 직렬화 (예 GraphSerializer.SerializeObjectTypeX 각 모드의 방법 일 (ObjectTypeX objectToSerialze) 여기에 우리가 새 모드를 원할 때마다 새 팩토리 클래스/메소드를 추가하기 만하면 DataObject가 소개되는 모든 직렬화 모드가 복잡해지지 않는다는 점이 이점입니다. 모든 다른 모드에 대해 동일한 직렬화 코드를 반복적으로 작성하십시오. 두 가지 모드가 하나 또는 두 개의 특성 만 다를지라도, 전체 그래프에 대한 논리를 다시 나타냅니다. 데이터 객체에 새 속성을 추가 할 때 모든 팩토리 클래스를 업데이트해야합니다.

그래서이 IMHO 일반적인 문제에 대한 더 나은 접근 방법이 있는지 궁금합니다. 아니면 .NET의 모범 사례입니까? 아니면 잘못된 생각으로 모든 것을 다룰 것인가?

답변

2

각 모드에 대해 별도의 serializer 클래스 (a-la XmlSerializer)를 만들고, 중복을 피하기 위해 상속 또는 캡슐화합니다. 속성의 특성을 사용하여 특정 모드에서 직렬화해야하는지 여부 및 표시 방법을 표시합니다.