C# 序列化接口对象时发生XmlSerializer错误

C# 序列化接口对象时发生XmlSerializer错误,c#,interface,xml-serialization,C#,Interface,Xml Serialization,我有一个实现公共接口的对象列表。如果我尝试简单地序列化它,我会得到一个很好的异常,它告诉我序列化程序无法序列化接口: private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>(); public ObservableCollection<ICanHasInterface> Children {

我有一个实现公共接口的对象列表。如果我尝试简单地序列化它,我会得到一个很好的异常,它告诉我序列化程序无法序列化接口:

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

至少序列化工作正常(注意:为可以在原始列表中的类型指定
xmlclude
属性,或者在序列化程序的构造函数中移交一个类型数组),但是,如果对象被反序列化,
子对象
集合最终为空,因为在反序列化过程中,
集合
块从未到达,我完全不知道这是为什么;有什么想法吗?

关于反序列化,序列化程序使用属性getter获取集合实例,然后为每个项调用Add()。它不调用属性设置器。大概是这样的:

YourClass c = new YourClass();
c.ChildrenSerialized.Add(ReadValue());
...
为了使集合保持同步,您需要自定义从属性getter返回的集合的Add()行为


更好的选择是将ChildrenSerialized属性更改为使用对象[]。对于数组,序列化程序将值读入数组,然后使用该值调用属性设置程序。

反序列化时,序列化程序使用属性获取程序获取集合实例,然后为每个项对其调用Add()。它不调用属性设置器。大概是这样的:

YourClass c = new YourClass();
c.ChildrenSerialized.Add(ReadValue());
...
为了使集合保持同步,您需要自定义从属性getter返回的集合的Add()行为

更好的选择是将ChildrenSerialized属性更改为使用对象[]。对于数组,序列化程序将值读入数组,然后使用该值调用属性设置程序