在C#中将对象序列化为应用程序设置

时间:2010-12-14 19:22:54

标签: c# xml-serialization appsettings

我正在尝试将对象序列化为“应用程序设置”。我已经将一个设置定义为对象类型。这是我试图序列化的类。我必须将对象序列化为应用程序设置,因为在运行时不知道对象类型。

[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属性,所以我有点难过。

2 个答案:

答案 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]属性。