使用System.Text.Json.JsonSerializer写入文件时未完全覆盖内容的问题
问题根源分析:FileStream写入未完全覆盖旧内容
相关代码
internal class Program { static async Task Main(string[] args) { var t = new Thing() { Name = "Some Long Name" }; string path = @"c:\_Temporary\serialized.json"; using var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); await JsonSerializer.SerializeAsync(fs, t); } class Thing { public string Name { get; set; } } }
运行现象
- 首次运行后,文件内容:
{"Name":"Some Long Name"}
- 将
Name改为"Short Name"后重新运行,文件内容变为:
{"Name":"Short Name"}me"}
问题根源
这是FileStream的使用方式有误导致的问题,和JsonSerializer无关。
使用FileMode.OpenOrCreate模式打开文件时,若文件已存在,流会直接打开现有文件但不会截断其原有长度。新写入的内容只会覆盖文件开头对应字节数的部分,未被覆盖的旧内容会保留在文件末尾,最终形成无效的JSON内容。
内容的提问来源于stack exchange,提问作者rory.ap
相关产品推荐
相关产品推荐

