2009-06-29 166 views
1

相关:How can I use polymorphism in XML Serialization?如何序列化/反序列化具有公共根类的对象列表?

我有一个类我写的序列化用户的喜好应用程序会话之间的磁盘。读/写我使用XmlSerializer.Deserialize()和XmlSerializer.Serialize()。一个被序列化的属性是不同应用程序组件的子设置列表。要做到这一点,我有这样的事(该属性序列化期间仅用于)以下:

private readonly Dictionary<SettingType, SubSettings> subSettings;  

[XmlArray("SubSettings")] 
[XmlArrayItem("SubSetting", Type=typeof(DictionaryEntry))] 
public DictionaryEntry[] _SubSettings 
{ 
    get 
    { 
     int i = 0; 

     //Make an array of DictionaryEntries to return 
     DictionaryEntry[] result = new DictionaryEntry[subSettings.Count]; 

     foreach(KeyValuePair<SettingType, SubSettings> setting in subSettings) { 
      DictionaryEntry entry = new DictionaryEntry(setting.Key, setting.Value); 
      result[i] = entry; 
      i++; 
     } 

     return result; 
    } 
    set 
    { 
     subSettings.Clear(); 
     for(int i = 0; i < value.Length; i++) 
      subSettings.Add((SettingType)value[i].Key, (SubSettings)value[i].Value); 
    } 
} 

这一直是我的服务非常清楚,所有的字典中的值是SubSettings动态。问题是,现在我想让一些SubSettings对象成为不同的动态类型(CoolSubSettings:SubSettings)。显而易见的问题是,如果我这样做,我将无法沟通,因为XML会读取每个SubSettings节点应该是什么动态类型,并且其附加属性不会被读取或写入。

回答

2

这是因为序列化程序不知道所有类型,所以必须告诉他它必须使用哪些类型。例如,你不能试试下面的办法:

struct DictEntry<T> 
{ 
    public SettingType Key; 
    public T Value; 
} 

// ... 

[XmlArray("SubSettings")] 
[XmlArrayItem("SubSetting", Type=typeof(DictEntry<SubSettings>))] 
[XmlArrayItem("CoolSubSetting", Type=typeof(DictEntry<CoolSubSettings>))] 
public object[] _SubSettings 
{ 
    // ... 

更新:然而,对于您的问题,另一种解决方案:

struct DictEntry 
{ 
    public SettingType Key;   
    [XmlElement("SubSettingValue", Type=typeof(SubSettings))]   
    [XmlElement("CoolSubSettingValue", Type=typeof(CoolSubSettings))] 
    public object Value; 
} 

[XmlArray("SubSettings")] 
public DictEntry[] _SubSettings 
{ 
    // ... 

我想你明白主要实现的想法?顺便说一下,我不清楚在这种情况下继承,我现在不能测试它。但是如果遇到麻烦,您可以为SubSettings和CoolSubSettings创建基本的祖先。

+0

但是底层词典呢?如果我按照你的建议做了什么,它会知道什么时候它进入subSettings字段,静态类型为SubSettings,它应该被序列化为CoolSubSettings? – Dov 2009-06-29 21:39:09

相关问题