2010-03-24 9 views
1

나는 종종 다른 복잡한 개체의 컬렉션을 가지고있는 다양한 복잡한 개체가 있습니다. 때로는 콜렉션이 필요할 때만 콜렉션을로드하려고하므로 콜렉션이로드되었는지 (null/empty가 반드시로드되지 않았 음을 의미하는 것은 아닙니다) 추적하는 방법이 필요합니다. 이렇게하려면 이러한 복잡한 개체가로드 된 컬렉션의 컬렉션을 유지 관리하는 클래스에서 상속합니다. 그리고 우리는 단지 우리가 지금처럼 추적 할 각 컬렉션에 대한 세터의 함수에 대한 호출을 추가해야합니다XmlSerializer 및 OnSerializing/OnSerialized 대안

public List<ObjectA> ObjectAList { 
    get { return _objectAList; } 
    set { 
     _objectAList = value; 
     PropertyLoaded("ObjectAList"); 
    } 
} 

PropertyLoaded 기능은 컬렉션이로드되어있는 추적 컬렉션을 업데이트합니다.

불행히도 이러한 객체는 웹 서비스에서 사용되며 (de) 직렬화되고 모든 setter가 호출되고 실제로 PropertyLoaded가 호출되지 않으면 호출됩니다.

이상적으로 나는 OnSerializing/OnSerialized를 사용할 수 있기를 원합니다. 그래서 함수가 합법적으로 호출되는 경우 함수가 알고 있지만 XmlSerializer를 사용하면 이것이 작동하지 않습니다. DataContractSerializer를 사용하여 변경하고 싶은만큼 여러 가지 이유로 지금은 할 수 없습니다.

직렬화가 발생하는지 알아볼 다른 방법이 있습니까? 그렇지 않다면 새로운 컬렉션을 추적해야 할 때마다 별도의 코드를 작성하지 않고도 위의 작업을 수행 할 수있는 더 좋은 방법이 있습니까?

답변

3

XmlSerializer은 직렬화 콜백을 지원하지 않습니다. 하지만 몇 가지 옵션이 있습니다. (

[XmlIgnore] 
public bool ObjectAListSpecified { 
    get { /* logic whether to include it in serialization */ } 
    set { /* logic to apply during deserialization */ } 
} 

: 당신이 너무 직렬화 복원시에 알아야 할 경우

public bool ShouldSerializeObjectAList() { /* logic */ } 

, 당신은 사용할 수 있습니다 : 당신이 ObjectAList라는 속성이 직렬화할지 여부를 선택하려는 경우 예를 들어, 당신은 방법을 추가 할 수 있습니다 당신이 찾을 수도 있지만 - 나는 확신 할 수 없다 - set은 물론, IXmlSerializable을 구현하는 것입니다,

다른 옵션)을 true 경우에 호출하지만이 단지 라로 수행되어야한다 세인트 리조트. 재미 있지 않습니다.