Приложение магазина Windows 8 XmlWriter ничего не записывает в файл

Я не очень хорошо разбираюсь в XML-библиотеках .NET и пытаюсь понять интерфейс 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();
    }

person rookie .net dev    schedule 07.07.2014    source источник
comment
Вы пытались позвонить x.Close()? Интересно, все ли это буферизовано... (В идеале используйте операторы using для fs и x.)   -  person Jon Skeet    schedule 07.07.2014
comment
Как выглядят fs и x при их отладке, есть ли у них информация?   -  person Bit    schedule 07.07.2014
comment
@JonSkeet Похоже, это была проблема с буферизацией. Вызов сброса в модуле записи xml устранил проблему. Спасибо.   -  person rookie .net dev    schedule 07.07.2014


Ответы (1)


Учитывая ветку комментариев - речь шла о том, чтобы не закрывать все ресурсы. Вы удаляете fs (вручную, если исключения не выдаются), но не x. Вы действительно должны использовать операторы using для всего, подобного этому:

using (var stream = await folder.OpenStreamForWriteAsync(...))
{
    var settings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Auto };
    using (var writer = XmlWriter.Create(stream, settings))
    {
        t.WriteXml(writer);
    }
}
person Jon Skeet    schedule 07.07.2014