在创建时,我有麻烦StreamWriter
在Windows 8对象,通常我只是创建只是传递一个字符串作为参数的实例,但在Windows 8中,我得到指示它应该免费获赠流的错误,但我注意到,流是一个抽象类,有谁知道怎么会写一个XML文件中的代码?顺便说一句,我使用的.xml,因为我要保存序列化对象,或有没有人知道如何保存到一个文件中的序列化对象在Windows 8?
有任何想法吗?
目前使用的是Windows 8消费者预览版
码:
StreamWriter sw = new StreamWriter("person.xml");
错误:
The best overloaded method match for 'System.IO.StreamWriter.StreamWriter(System.IO.Stream)' has some invalid arguments
取而代之的StreamWriter,你会使用这样的:
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.CreateFileAsync();
using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0))
{
using (DataWriter dataWriter = new DataWriter(outputStream))
{
//TODO: Replace "Bytes" with the type you want to write.
dataWriter.WriteBytes(bytes);
await dataWriter.StoreAsync();
dataWriter.DetachStream();
}
await outputStream.FlushAsync();
}
}
你可以看一下StringIOExtensions在类WinRTXamlToolkit库样本使用。
编辑*
虽然上述所有应该工作-他们的前写FileIO
类WinRT中,从而简化了大多数常见的情况是,上述解决方案解决了,因为你现在可以只调用面世await FileIO.WriteTextAsync(file, contents)
写文本文件,也有类似的方法来读取,写入或追加字符串或字符串,字节,列表IBuffers
。
您可以创建您可以通过类似这样的应用进行使用一个共同的静态方法
private async Task<T> ReadXml<T>(StorageFile xmldata)
{
XmlSerializer xmlser = new XmlSerializer(typeof(List<myclass>));
T data;
using (var strm = await xmldata.OpenStreamForReadAsync())
{
TextReader Reader = new StreamReader(strm);
data = (T)xmlser.Deserialize(Reader);
}
return data;
}
private async Task writeXml<T>(T Data, StorageFile file)
{
try
{
StringWriter sw = new StringWriter();
XmlSerializer xmlser = new XmlSerializer(typeof(T));
xmlser.Serialize(sw, Data);
using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0))
{
using (DataWriter dataWriter = new DataWriter(outputStream))
{
dataWriter.WriteString(sw.ToString());
await dataWriter.StoreAsync();
dataWriter.DetachStream();
}
await outputStream.FlushAsync();
}
}
}
catch (Exception e)
{
throw new NotImplementedException(e.Message.ToString());
}
}
编写XML简单地使用
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("data.xml",CreationCollisionOption.ReplaceExisting);
await writeXml(Data,file);
和读取XML使用
StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.xml");
Data = await ReadXml<List<myclass>>(file);