我在windows-8中创建StreamWriter
对象时遇到了麻烦,通常我只是创建一个实例,只是将一个字符串作为参数传递,但是在Windows 8中我得到一个错误,表明它应该被接收一个Stream,但是我注意到Stream是一个抽象类,有没有人知道如何编写一个xml文件?BTW我正在使用.xml因为我想保存序列化对象,或者有人知道如何在Windows 8中将序列化对象保存到文件中。
有什么想法吗?
目前正在使用Windows 8 Consumer Preview
代码:
StreamWriter sw = new StreamWriter("person.xml");
错误:
The best overloaded method match for 'System.IO.StreamWriter.StreamWriter(System.IO.Stream)' has some invalid arguments
答案 0 :(得分:27)
您可以使用以下内容代替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类以供使用。
编辑*
虽然以上所有内容都应该有效 - 但它们是在WinRT中FileIO
类可用之前编写的,这简化了上述解决方案解决的大多数常见方案,因为您现在只需调用await FileIO.WriteTextAsync(file, contents)
即可将文本写入文件,并且还有类似的方法来读取,写入或追加字符串,字节,字符串列表或IBuffers
。
答案 1 :(得分:4)
您可以创建一个通用的静态方法,您可以通过这样的应用程序使用
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);