Не удается сохранить XDocument в классе настроек приложения

Я пытаюсь использовать IXmlSerializableReadXml а также WriteXml методы с XDocument объект (используя Foo.WriteTo( ... ) а также XDocument.Load( ... ) методы.

Я хочу хранить класс, который реализует IXmlSerializable интерфейс в переменную, хранящуюся в классе настроек приложения по умолчанию.

Попытка сделать это приводит к довольно неприятному провалу:

Это класс настроек:

Это класс, упаковывающий

[Serializable]
class XmlModel : IXmlSerializable {
    public XDocument _foo = new XDocument(
        new XElement( "Foo",
            new XElement( "Bar", "Baz" ) ) );

    public XmlModel( XDocument Foo ) {
        _foo = Foo;
    }

    public XmlSchema GetSchema( ) {
        return null;
    }

    public void ReadXml( XmlReader reader ) {
        this._foo = XDocument.Load( reader );
    }

    public void WriteXml( XmlWriter writer ) {
        _foo.WriteTo( writer );
    }
}

Ааа, а это класс Program (я использую простое консольное приложение для воспроизведения проблемы)

class Program {
    static void Main( string[ ] args ) {
        if ( Settings.Default.DoUpgrade ) {
            Settings.Default.Upgrade( );
            Settings.Default.DoUpgrade = false;
            Settings.Default.Save( );
        }
        Console.WriteLine( Settings.Default.Foo._foo );
        Console.ReadLine( );
    }
}

Это исключение появляется, потому что у меня включены все исключения, но даже если они выключены, ApplicationSettings файл не принимает данные.

Почему это происходит?

1 ответ

Я нашел ответ, и Лей Ян был прав (по крайней мере, в том смысле, что я не могу использовать XDocuments с настройками приложения).

Согласно документам...

    /// <summary>
    /// Output this <see cref="XElement"/> to an <see cref="XmlWriter"/>.
    /// </summary>
    /// <param name="writer">
    /// The <see cref="XmlWriter"/> to output the XML to.
    /// </param>
    public void Save(XmlWriter writer) {
        if (writer == null) throw new ArgumentNullException("writer");
        writer.WriteStartDocument();
        WriteTo(writer);
        writer.WriteEndDocument();
    }

XDocument.Save( ) звонки writer.WriteStartDocument( )который, по-видимому, называется далее в ApplicationSettings.Save( ) метод, а так как XDocument.Save( ... ) не может быть отменено, я (и, соответственно, все остальные, кто пытался это сделать) должен будет найти другой путь.

РЕДАКТИРОВАТЬ

Используя XElement вместо XDocument позволяет сохранить его в ApplicationSettings учебный класс:

[Serializable]
class XmlModel : IXmlSerializable {
    public XElement _foo = new XElement(
        "Foo", new XElement( "Bar", "Baz" ) );

    public XmlModel( XElement Foo ) {
        _foo = Foo;
    }

    public XmlSchema GetSchema( ) {
        return null;
    }

    public void ReadXml( XmlReader reader ) {
        this._foo = XElement.Load( reader );
    }

    public void WriteXml( XmlWriter writer ) {
        _foo.WriteTo( writer );
    }
}
Другие вопросы по тегам