0

我正在尝试对对象使用IXmlSerializable ReadXmlandWriteXml方法XDocument(使用Foo.WriteTo( ... )andXDocument.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 );
    }
}

Aaaand 这是 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文件也不会获取数据。

为什么会这样?

4

1 回答 1

0

我找到了答案,Lei Yang 是正确的(至少在我不能将 XDocuments 与 Application Settings 一起使用的意义上)。

根据文档...

    /// <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( ... )不能被覆盖,我(以及通过扩展,所有尝试过这个的人)将不得不找到另一种方法。

编辑

使用 anXElement而不是 anXDocument可以将其保存到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 );
    }
}
于 2016-12-13T05:12:08.610 回答