0

私は .NET の XML ライブラリに精通しておらず、IXmlSerializable インターフェイスに頭を悩ませようとしています。私は Windows ストア アプリ (W8) を開発しており、IXmlSerializable インターフェイスを使用したいと考えていますが、問題が発生しています。XmlTextWriter は Windows ストア アプリでは使用できないため、XmlWriter のファクトリ メソッドを使用していますが、コードは XML ファイル (空白) に何も出力しません。

XmlSerializer を使用すると、XML ファイルは期待どおりに出力されますが、本番アプリにはプライベート フィールドがあるため、IXmlSerializable を実装したいと考えています。

これが私が使用しているサンプルコードです

public class XMLTest : IXmlSerializable
{
    private string name;
    public string Name { get { return this.name; } set { this.name = value; } }

    private XMLTest() { }

    public XMLTest(string name)
    {
        this.name = name;
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        throw new NotImplementedException();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteAttributeString("Name", this.name);
    }
}

私のXAMLコードビハインド

private async void saveButton_Click(object sender, RoutedEventArgs e)
    {
        XMLTest t = new XMLTest("test name");

        StorageFolder folder = ApplicationData.Current.LocalFolder;
        Stream fs = await folder.OpenStreamForWriteAsync("testingXML.xml", CreationCollisionOption.ReplaceExisting);
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.ConformanceLevel = ConformanceLevel.Auto;
        var x = XmlWriter.Create(fs, settings);

        //XmlSerializer xs = new XmlSerializer(t.GetType());
        //xs.Serialize(fs, t);

        t.WriteXml(x);
        fs.Dispose();
    }
4

1 に答える 1

1

コメント スレッドを考えると、これはすべてのリソースを閉じないことに関するものでした。あなたはfs(例外がスローされない場合は手動で)処分していますが、そうではありませんxusing次のようなすべてのステートメントを実際に使用する必要があります。

using (var stream = await folder.OpenStreamForWriteAsync(...))
{
    var settings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Auto };
    using (var writer = XmlWriter.Create(stream, settings))
    {
        t.WriteXml(writer);
    }
}
于 2014-07-07T17:00:21.810 に答える