我正在尝试将对象序列化为“应用程序设置”。我已经将一个设置定义为对象类型。这是我试图序列化的类。我必须将对象序列化为应用程序设置,因为在运行时不知道对象类型。
[Serializable]
[XmlInclude(typeof(TemplateGeneratorPreferences))]
public class MyPreferences
{
[XmlElement(ElementName="GeneratorPreferences", Type=typeof(TemplateGeneratorPreferences))]
public TemplateGeneratorPreferences FormSpecificPref{ get; set; }
public MyPreferences()
{
GeneratorPreferences = new ScenarioTemplateGeneratorPreferences();
}
}
[Serializable]
public class TemplateGeneratorPreferences
{
[XmlAttribute("MyBool")]
public bool MyBool { get; set; }
public ScenarioTemplateGeneratorPreferences()
{
MyBool = true;
}
}
这根本不会序列化,我得到以下例外:
“不期望MyPreferences类型。使用XmlInclude或SoapInclude attribute用于指定静态未知的类型。“
我包含了XmlInclude属性,所以我有点难过。
答案 0 :(得分:1)
来自MSDN(搜索错误消息时谷歌中弹出的第一个链接)告诉您它只是需要使用该属性进行扩充的基本类型。
[System.Xml.Serialization.XmlInclude( typeof( Derived ) )]
public class Base
{
// ...
}
当字段或属性定义为Base类型时,附加XmlInclude属性允许XmlSerializer序列化引用派生类型对象的字段。
答案 1 :(得分:0)
您能否显示用于序列化为应用设置的代码?
问题似乎与您定义的类型无关。当我这样做时,我获得了成功的序列化:
<MyPreferences
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GeneratorPreferences MyBool="true" />
</MyPreferences>
对于这样定义的类:
public class MyPreferences
{
[XmlElement(ElementName="GeneratorPreferences")]
public TemplateGeneratorPreferences FormSpecificPref { get; set; }
public MyPreferences()
{
FormSpecificPref = new TemplateGeneratorPreferences();
}
}
public class TemplateGeneratorPreferences
{
[XmlAttribute("MyBool")]
public bool MyBool { get; set; }
public TemplateGeneratorPreferences()
{
MyBool = true;
}
}
和这样的序列化代码:
var m = new MyPreferences();
var s1 = new XmlSerializer(typeof(MyPreferences));
s1.Serialize(Console.Out, m);
注意:对于将通过Xml Serializer运行的类,您不需要[Serializable]
属性。