【发布时间】:2017-07-23 13:05:30
【问题描述】:
所以我正在开发一个在可移植类库 (Xamarin) 中创建的 UWP 应用程序。我需要将用户输入的信息(例如在 TextBoxes 中)保存在 xml 文件中。
因此,我在 PCL 中创建了一个类,从这些 TextBox 中获取信息:
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();
}
}
}
问题是每当我到达 CreateandSave 按钮并单击它时,应用程序就会冻结。没有错误,没有,一切看起来都很好。在我分解调试后,我可以看到在我想要的文件夹中创建了一个 xml 文件,但它是空的(0 字节)。代码有什么问题?有人有想法吗?
【问题讨论】:
-
为什么不在接口中添加一个方法,例如“WriteStringToFileAsync(string s)”,然后在每个平台上实现它。所以你不必在两个类之间传递流。这应该会使调试变得容易得多。
-
@Malte 我对编程很陌生,我认为您的建议会超出我的理解。我不太明白你的意思或我将如何实现它。不过还是谢谢你的建议,我很感激!
-
您可以将方法“WriteStringToFileAsync(string s)”添加到您的接口 IFileHelper 而不是 MakeFileStream,在每个平台上实现此方法(例如带有 Windows.Storage.FileIO.WriteTextAsync 的 UWP)然后序列化您的数据到 XML 字符串从 DependencyService 获取 IFileHelper 的实现,并将字符串传递给 WriteStringToFile 方法。我希望这可以帮助您理解我要解释的内容。
-
@Malte 知道了,谢谢!但是冻结的问题仍然存在:(
-
冻结是从哪一行代码开始的?
标签: c# xml serialization xamarin uwp