2011-01-10 5 views
1

공용 인터페이스를 구현하는 개체 목록이 있습니다.
"는 인터페이스이기 때문에 ... 형 ... 직렬화 할 수 없습니다 멤버"XmlSerializer 오류 직렬화 인터페이스 개체

private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>(); 
public ObservableCollection<ICanHasInterface> Children 
{ 
    get { return children; } 
} 

=> : 나는 단순히 직렬화하려고하면 나는 시리얼이 인터페이스를 직렬화 할 수없는 나에게 알려주는 좋은 예외가
분명히 개체의 형식을 가져오고 xsi:type (개체가 다른 클래스에서 상속 된 경우 수행됨) 특성을 가진 XmlElement를 표시하도록 serializer에 요청하는 것은 너무 많습니다. 이와

private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>(); 
[XmlIgnore()] 
public ObservableCollection<ICanHasInterface> Children 
{ 
    get { return children; } 
} 

[XmlElement("Child")] 
public List<object> ChildrenSerialized 
{ 
    get 
    { 
     return new List<object>(Children); 
    } 
    set 
    { 
     Children.Clear(); 
     foreach (var child in value) 
     { 
      if (child is ICanHasInterface) AddChild(child as ICanHasInterface); 
     } 
    } 
} 

직렬화 단지 (미세 참고 작동 적어도 : 나는 IXmlSerializable를 구현하고 싶지 않기 때문에
그래서, 나는 유망 처음 보았다 해결 방법까지 생각 어느 유형에 대한 XmlInclude 속성을 지정을 그 수 원래 목록에 있거나 serializer의 생성자에 배열 형식을 넘겨 줘야합니다.) 그러나 개체가 deserialize하는 동안 set 블록에 도달하지 않았기 때문에 Children 컬렉션이 비어있게됩니다. 이유는 무엇입니까? 이다; 어떤 아이디어?

답변

1

직렬화가 serializer에서 속성 가져 오기 도구를 사용하여 컬렉션 인스턴스를 가져온 다음 각 항목에 대해 Add()를 호출합니다. 그것은 당신의 재산 세터를 부르지 않습니다. 이런 식으로 뭔가 : 당신은 당신이 프로퍼티 게터에서 반환 컬렉션의 Add() 동작을 사용자 정의해야 할 것 동기화 된 컬렉션을 유지하기 위해

YourClass c = new YourClass(); 
c.ChildrenSerialized.Add(ReadValue()); 
... 

.

더 나은 옵션은 개체 []를 사용하도록 ChildrenSerialized 속성을 변경하는 것입니다. 배열의 경우, serializer는 값을 배열로 읽어 들인 다음 값으로 속성 setter를 호출합니다.

+0

고마워, 배열과 완벽하게 작동합니다! –