1

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

[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 属性指定静态未知的类型。”

我包含了 XmlInclude 属性,所以我有点难过。

4

2 回答 2

1

MSDN(搜索错误消息时在 google 中弹出的第一个链接)告诉您,它只是需要使用属性扩充的基本类型。

[System.Xml.Serialization.XmlInclude( typeof( Derived ) )]
public class Base
{
    // ...
}

当字段或属性定义为 Base 类型时,附加 XmlInclude 特性允许 XmlSerializer 序列化引用 Derived 类型对象的字段。

于 2010-12-14T19:32:03.893 回答
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);

注意:您不需要[Serializable]将通过 Xml 序列化程序运行的类的属性。

于 2010-12-26T19:39:01.063 回答