2013-03-13 27 views
1

我有下面的类结构 C#XML(DE)孩子的序列化对象

[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只应该序列化名称)

回答

0

您必须在反序列化之后手动设置它。在反序列化过程中,你的构造函数没有被调用。这是默认行为。

+0

我现在正在做的是手动将item.mod设置为我在mod列表中找到的mod。那是你在说什么? foreach(Item中的item.Items) { item.Mod = instance.Mods.Find(x => x.Name == item.Mod.Name); } – Patrick 2013-03-13 14:35:49

+0

是的,正是:)。我有同样的问题,并以同样的方式解决它。 – virious 2013-03-13 15:15:27