无法将XDocument保存到Application Settings类中

时间:2016-12-13 01:06:48

标签: c# xml linq-to-xml settings ixmlserializable

我正在尝试将IXmlSerializable ReadXmlWriteXml方法与XDocument对象一起使用(使用Foo.WriteTo( ... )XDocument.Load( ... )方法。

我想将实现IXmlSerializable接口的类存储到存储在默认Application Settings类中的变量中。

尝试这样做会导致非常令人讨厌的失败:

enter image description here

这是设置类:

enter image description here

这是包装

的类
[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文件也不会获取数据。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

我找到了答案,雷阳是正确的(至少在我不能将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 );
    }
}