Сериализация объекта в настройках приложения в C # - PullRequest
1 голос
/ 14 декабря 2010

Я пытаюсь сериализовать объект в настройках приложения.У меня есть настройка, определенная как тип объекта уже.Вот класс, который я пытаюсь сериализовать.Я должен сериализовать объект с настройками приложения, потому что тип объекта не известен во время выполнения.

[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, поэтому я немного озадачен.

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

С MSDN (первая ссылка, которая появляется в Google при поиске вашего сообщения об ошибке) говорит о том, что только базовый тип необходимо дополнить атрибутом.

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

Присоединение атрибута XmlInclude позволяет XmlSerializer сериализовать поля, ссылающиеся на объекты производного типа, когда поле или свойство определено как тип Base.

0 голосов
/ 26 декабря 2010

Можете ли вы показать код, который вы используете для сериализации в настройках приложения?

Проблема не в типах, которые вы определили.Когда я это делаю, я получаю успешную сериализацию:

<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.

...