Boa*_*ler 9 c# json.net c#-5.0 windows-runtime winrt-async
Json.net具有将对象转换为json的异步函数,如:
jsn = await JsonConvert.DeserializeObjectAsync<T>
Run Code Online (Sandbox Code Playgroud)
但是当我想将对象写入json文件时,我最好直接使用文件Stream.
所以我认为它应该是这样的:
var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite);
using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0))
{
using (StreamWriter sw = new StreamWriter(fileStream.AsStreamForWrite()))
{
using (JsonWriter jw = new JsonTextWriter(sw))
{
jw.Formatting = Formatting.Indented;
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(jw, obj);
}
}
Run Code Online (Sandbox Code Playgroud)
但是在JsonSerzializer对象上我找不到异步方法.另外我认为IO操作不应该放在自己的线程中.
推荐的方法是什么?
另请参阅此代码,该代码使用正确的异步方式(例如,它不会创建巨大的字节数组以避免LOH内存分配,它不会等待IO操作完成).
// create this in the constructor, stream manages can be reused
// see details in this answer https://stackoverflow.com/a/42599288/185498
var streamManager = new RecyclableMemoryStreamManager();
using (var file = File.Open(destination, FileMode.Create))
{
using (var memoryStream = streamManager.GetStream()) // RecyclableMemoryStream will be returned, it inherits MemoryStream, however prevents data allocation into the LOH
{
using (var writer = new StreamWriter(memoryStream))
{
var serializer = JsonSerializer.CreateDefault();
serializer.Serialize(writer, data);
await writer.FlushAsync().ConfigureAwait(false);
memoryStream.Seek(0, SeekOrigin.Begin);
await memoryStream.CopyToAsync(file).ConfigureAwait(false);
}
}
await file.FlushAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
整个文件:https://github.com/imanushin/AsyncIOComparison/blob/0e2527d5c00c2465e8fd2617ed8bcb1abb529436/IntermediateData/FileNames.cs