如何释放由JsonSerializer.Serialize(Utf8JsonWriter) 写入的文件?

编程语言 2026-07-12

我在测试一个读取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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章