Это потому, что сериализатор не знает всех типов, вы должны сказать ему, какие типы он должен использовать. Например, вы не можете попробовать следующий подход:
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.