gpt4 book ai didi

c# - 序列化时间太长

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:33 26 4
gpt4 key购买 nike

因此,我正在开发一个在可移植类库 (Xamarin) 中创建的 UWP 应用程序。我需要将用户输入的信息(例如在文本框中)保存在 xml 文件中。

因此我在 PCL 中创建了一个类,我从这些文本框中获取信息:

namespace myProject
{
public class XMLData
{
[XmlRoot("MyRootElement")]
public class MyRootElement
{
[XmlAttribute("MyAttribute1")] //name of the xml element
public string MyAttribute1 //name of a textboxt e.g.
{
get;
set;
}
[XmlAttribute("MyAttribute2")]
public string MyAttribute2
{
get;
set;
}
[XmlElement("MyElement1")]
public string MyElement1
{
get;
set;
}
}
}

在每个页面上都有一个“继续”按钮。单击时,数据将被保存:

async void Continue_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new Page2());
XMLData.MyRootElement mre = new XMLData.MyRootElement
{
MyAttribute1 = editor1.ToString(),
MyAttribute2 = editor2.ToString(),
MyElement1 = editor3.ToString()
};
}

点击最后​​一个按钮,文件应该被创建并保存:

private void CreateandSave_Clicked(object sender, EventArgs e)
{
var s = DependencyService.Get<IFileHelper>().MakeFileStream();//using dependencyService to get a stream (there is no system.io.stream in PCL)
XMLData xmldat = new XMLData();
using (StreamWriter sw = new StreamWriter(s, Encoding.UTF8))
{
XmlSerializer serializer = new XmlSerializer(typeof(XMLData));
serializer.Serialize(sw, xmldat);
}
}

这是我在 UWP 类中的代码(对于 dependencyService,我创建了一个名为 FileHelper 的类来获取流并创建保存位置 + 文件)

namespace myProject.UWP
{
public class FileHelper: IFileHelper //IFileHelper is a simple interface I made with the Stream MakeFileStream(); method in it
{
public async Task<IRandomAccessStream> MakeFileStreamAsync()
{
StorageFolder sf = KnownFolders.DocumentsLibrary;

var file = await sf.CreateFileAsync("data.xml", CreationCollisionOption.OpenIfExists);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
return stream;
}
}
Stream IFileHelper.MakeFileStream()
{
var task = MakeFileStreamAsync();
task.Wait();
return task.Result.AsStreamForWrite();
}
}
}

问题是,每当我到达创建和保存按钮并单击它时,应用程序就会卡住。没有错误,什么都没有,一切看起来都很好。在我中断调试后,我可以看到在我想要的文件夹中创建了一个 xml 文件,但它是空的(0 字节)。代码有什么问题?有人有想法吗?

最佳答案

在这段代码中:

using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
return stream;
}

您正在返回一个由 using block 创建的实例。它将在返回之前被处置,因此,您将返回一个已处置的对象。

将其更改为仅返回流。您使用的 StreamWriter 本身位于 using block 中,因此在处理过程中 it will dispose the underlying stream :

The StreamWriter object calls Dispose() on the provided Stream object when StreamWriter.Dispose is called.

关于c# - 序列化时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42578573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com