2011-05-03 2 views
0

비즈니스 객체가 있다고 가정 해 봅시다. Foo으로, Bar의 정렬 된 목록이 포함되어 있습니다. 이 Foo을 XML로 전달합니다.소비 클래스에서 작업하는 개발자에게 지속적인 컨텐트를 전달하는 방법

우리는 자체가 아이 Bar XML 노드 (BarXMLDeserializer)를 역 직렬화 클래스를 사용하는 Foo XML 노드 (FooXMLDeserializer)를 역 직렬화하는 클래스가 있습니다.

지금, 나는 FooXMLDeserializerBarXMLDeserializer의 상태를 다시 설정하라는없이 두 개의 Foo 노드에서 호출되는 경우, 결과가 유효하지 않을 수 있도록 몇 가지 상태를 유지 BarXMLDeserializer 몇 가지 기능을 추가하고있다. BarXMLDeserializerFoo에 최종 Bar을 처리 한시기를 알지 못합니다.

BarXMLDeserializer 클래스가 상태를 가지고있는 클래스를 사용하는 개발자와 통신하도록 디자인 할 수있는 방법이 있으며 각 Foo에 대해 재설정해야합니까?

추가 정보 :

  • 내 변화는 내가 나에게 친절하게이 문제를 처리하기 위해 전체 시스템을 재 설계 X 일 보낼 수 있도록 내 매니저를 설득 할 수 없습니다 우리의 코드에있는 작은 부족 문제를 해결한다 케이스.
  • 중요한 경우 BarXMLDeserializer은 내부에있는 BarStateTracker 클래스에 상태를 유지합니다.
  • C#에서 프로그래밍하지만보다 일반적인 솔루션을 찾고 있습니다.

감사합니다.

답변

3

만 정적 메서드로 시리얼을 노출 : 당신이 데이터를 직렬화 복원이 끝나면

// no public constructor, etc 
var deserializer = BarXMLDeserializer.CreateNew(); 

그런 다음, 개체의 필드를 표시합니다. 필드가 설정된 경우 같은 인스턴스가 deserialize 메서드가 호출 될 때 더 많은 데이터를 deserialize하는 데 사용되는 경우 예외가 발생합니다.

if(IsInstanceExhausted) 
    throw new InvalidOperationException("You must use a fresh instance."); 

첫 번째 예외가 발생하면 알아낼 것입니다. 그 코드는 자연스럽게 문을 사용하여 사용합니다 그래서 또한,는 IDisposable와 같은 클래스를 표시 :

using(var deserializer = BarXMLDeserializer.CreateNew()) 
{ 
} 

목록 추가 방법에 간다. 대체로 인 경우 Deserializer가 deserialization 시도 후에 상태를 지우거나 재설정하거나 Deserialization 시도가 시작될 때 상태를 지우도록 Deserializer를 설계 할 수 있습니다.

관련 문제