共通のインターフェイスを実装するオブジェクトの一覧があります。
「それはインターフェースがあるので...タイプで...シリアライズできないメンバー」XmlSerializerエラーシリアルインターフェイスオブジェクト
private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>();
public ObservableCollection<ICanHasInterface> Children
{
get { return children; }
}
=>:私は単にそれをシリアル化しようとした場合、私は、シリアライザは、インタフェースをシリアル化することができないことを私に伝える素敵な例外を取得します
明らかに、シリアライザにオブジェクトの型を取得し、属性がxsi:type
(オブジェクトが別のクラスを継承する場合に行われる)のXmlElementをマークすることを余儀なくされています。私はIXmlSerializable
を実装したくないので
だから、私は当初有望に見えた回避策を思いついた:少なくともシリアル化だけで正常に動作これにより
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);
}
}
}
を(注:いずれかのことができタイプのためXmlInclude
属性を指定します元のリストにあるか、シリアライザのコンストラクタに配列の配列を渡してください)。逆シリアル化中にset
ブロックに到達しないため、オブジェクトが逆シリアル化された場合、Children
コレクションは空になります。なぜこのそうです。何か案は?
ありがとうございます、配列を使って完全に動作します! –