如何释放由JsonSerializer.Serialize(Utf8JsonWriter) 写入的文件?
我在测试一个读取JSON文件的方法。因此在设置阶段,我先创建了上述JSON文件,如下所示:
string pathOfRelevantStuff = "path";
string fileOfRelevantStuff = Path.Combine(pathOfRelevantStuff, $"fileName_1.json");
Utf8JsonWriter relevantDataWriter = new(File.Create(fileOfRelevantStuff));
JsonSerializer.Serialize(relevantDataWriter, dataToBeReadLater);
relevantDataWriter.Flush();
relevantDataWriter.Dispose();
我测试的方法使用了以下代码:
string pathToRead = "path";
FileStream relevantDataReader = null;
foreach (string fileToRead in Directory.EnumerateFiles(pathToRead, "fileName_*"))
{
try
{
relevantDataReader = File.OpenRead(fileToRead);
// [...]
}
}
最后一行抛出一个异常:“无法访问文件 'path\fileName_1json',因为它正被另一个进程使用。”
在调试时,我在 relevantDataWriter.Dispose(); 之后中断了执行,前往Windows资源管理器,尝试查看文件的内容:记事本说无法打开该文件,因为它正被另一个进程使用。
以下变通方法可以正常工作:
string pathOfRelevantStuff = "path";
string fileOfRelevantStuff = Path.Combine(pathOfRelevantStuff, $"fileName_1.json");
StreamWriter relevantDataWriter = File.CreateText(fileOfRelevantStuff);
string relevantDataString = JsonSerializer.Serialize(dataToBeReadLater);
relevantDataWriter.WriteLine(relevantDataString);
relevantDataWriter.Close();
relevantDataWriter.Dispose();
出于遗留原因,我使用System.Text.Json版本7.0.3。
我在第一种方法上做错了什么?
解决方案
一个最小可复现的JSON序列化示例大致如下:
using (var fs = File.Create(@"c:\temp\myJson.json"))
{
JsonSerializer.Serialize(fs, 42);
}
using (var fs = File.OpenRead(@"c:\temp\myJson.json"))
{
var obj = JsonSerializer.Deserialize<int>(fs);
}
Utf8JsonWriter 并不是进行JSON序列化所必需的。如果出于某种原因你想使用它,仍然应该对底层流进行释放:
using (var fs = File.Create(@"c:\temp\myJson.json"))
{
using (var writer = new Utf8JsonWriter(fs))
{
JsonSerializer.Serialize(writer, 42);
}
}
请注意,某些“writer”类会对传入的流拥有所有权。我在 Utf8JsonWriter 中找不到对此的相关说明,因此最好确保自己对流进行释放(Dispose)。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。