0

System.Xml.Serialization を使用してクラスを逆シリアル化したいのですが、リスト プロパティを使用すると奇妙な動作に気づきました。

set メソッドを呼び出さないため、重要な情報が失われます...

シリアライズ方法の切り替えは避けたい。

public class Category
{
    private string _name;
    private List<Category> _subCategories;
    private Category _parent;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public List<Category> SubCategories
    {
        get { return _subCategories; }
        set
        {
            _subCategories = value;
            foreach (Category category in _subCategories) 
            { 
                category.Parent = this; 
            }
        }
    }

    [System.Xml.Serialization.XmlIgnoreAttribute]
    public Category Parent
    {
        get { return _parent; }
        set { _parent = value; }
    }
}
4

1 に答える 1

2

実際、シリアライザープロパティを設定しSubCategoriesますが、それを空のリストに設定してから、項目をリストに追加します。そのためParent、子のプロパティは設定されません。親子関係の XML シリアライゼーションについて少し前に記事を書きました。ここで見つけることができます。

その記事のソリューションを使用すると、Categoryクラスは次のようになります。

public class Category : IChildItem<Category>
{
    private string _name;
    private readonly ChildItemCollection<Category, Category> _subCategories;
    private Category _parent;

    public Category()
    {
        _subCategories = new ChildItemCollection<Category, Category>(this);
    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public ChildItemCollection<Category, Category> SubCategories
    {
        get { return _subCategories; }
    }

    [System.Xml.Serialization.XmlIgnoreAttribute]
    public Category Parent
    {
        get { return _parent; }
        set { _parent = value; }
    }
}
于 2012-04-19T23:24:11.270 に答える