1

私は次のクラス構造を持っています

[Serializable]
public class Manager
{
    List<item> items
    List<Mod> mods

    [XmlArray("Items"), XmlArrayItem(typeof(Item), ElementName = "Item")]
    public List<Item> Items
    {
        get
        {
            return items;
        }
    }

    [XmlArray("Mods"), XmlArrayItem(typeof(Mod), ElementName = "Mod")]
    public List<Mod> Mods
    {
        get
        {
            return mods;
        }
    }
}
[Serializable]
public class Item
{
    string name;
    Mod mod;

    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
    public Mod Mod
    {
        get
        {
            return mod;
        }
        set
        {
            mod = value;
        }
    }

    private Item()
    { }

    public Item(string name, Mod mod)
    {
        this.Name = name;
        this.Mod = mod;
    }
}

シリアル化は期待どおりに進みますが、逆シリアル化するときに、item.Mod オブジェクトが mods リスト内のオブジェクトを指すようにします。代わりに、新しいインスタンスを作成します。これを行う方法はありますか?

私が今していることは、逆シリアル化後に正しいインスタンスを手動で収集することです

foreach (Item item in instance.Items)
{
  item.Mod = instance.Mods.Find(x => x.Name == item.Mod.Name);
}

それが不可能な場合、アイテムの mod.Name のみをシリアル化する方法はありますか? (したがって、mod 自体は完全にシリアル化する必要がありますが、item.mod は名前のみをシリアル化する必要があります)

4

1 に答える 1

0

これは、デシリアライズ後に手動で設定する必要があります。逆シリアル化中、コンストラクターは呼び出されません。それがデフォルトの動作です。

于 2013-03-13T14:29:18.813 に答える