0

オブジェクトでIXmlSerializable ReadXmlandWriteXmlメソッドを使用しようとしています ( andメソッドを使用します。XDocumentFoo.WriteTo( ... )XDocument.Load( ... )

IXmlSerializableインターフェイスを実装するクラスを、デフォルトの Application Settings クラス内に格納されている変数に格納したいと考えています。

これを行おうとすると、かなり厄介な失敗が発生します。

ここに画像の説明を入力

これは設定クラスです:

ここに画像の説明を入力

これは、

[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ファイルはデータを取得していません。

なぜこうなった?

4

1 に答える 1

0

私は答えを見つけました.Lei Yangは正しかったです(少なくとも、 Application Settings で 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 );
    }
}
于 2016-12-13T05:12:08.610 に答える