System.Text.Json.JsonSerializer не полностью перезаписывает существующий файл при использовании файлового потока.C#

Место общения программистов C#
Anonymous
System.Text.Json.JsonSerializer не полностью перезаписывает существующий файл при использовании файлового потока.

Сообщение Anonymous »

Рассмотрим следующий код:

Код: Выделить всё

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 на более короткое:

Код: Выделить всё

var t = new Thing() { Name = "Short Name" }; // was "Some Long Name" before.
И перезапустите код, теперь файл имеет такое содержимое:

Код: Выделить всё

{"Name":"Short Name"}me"}
Обратите внимание на недопустимый JSON в конце. Понятно, что операция не полностью перезаписала файл, а лишь перезаписала достаточную часть файла, чтобы применить новое содержимое в начале файлового потока, оставив то, что было ранее в файле, нетронутым.
Такое поведение было для меня неожиданным, и я не знаю, что я делаю неправильно — это то, как я использую FileStream (я пробовал разные варианты FileMode и FileAccess), или это то, как Я использую JsonSerializer? В чем проблема? Я знаю несколько способов это исправить; Я не спрашиваю: «Как мне заставить этот код работать правильно?». Мне просто хотелось бы знать, где я ошибся.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -when-usin

Вернуться в «C#»