2014-07-07 137 views
0

我不是很熟悉.NET的XML库,并试图将我的头包裹在IXmlSerializable接口中。我正在开发一个Windows Store应用程序(W8),并希望使用IXmlSerializable接口,但遇到问题。 XmlTextWriter在Windows Store应用程序中不可用,所以我使用XmlWriter的工厂方法,但是我的代码不会向XML文件(其空白)输出任何内容。Windows 8商店应用程序XmlWriter不会写任何文件

如果我使用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(); 
    } 
+1

你有没有打过电话'x.Close()'?我想知道它是否全部缓冲......(理想情况下,对'fs'和'x'使用'using'语句。) –

+0

调试它们时fs和x看起来像什么,它们是否有信息? – Bit

+0

@JonSkeet看起来这是一个缓冲问题。在xml编写器上调用刷新修复了这个问题。谢谢。 –

回答

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); 
    } 
} 
相关问题