JsonSerializer.Serialize вызывает исключение нехватки памяти после нескольких вызововC#

Место общения программистов C#
Ответить
Anonymous
 JsonSerializer.Serialize вызывает исключение нехватки памяти после нескольких вызовов

Сообщение Anonymous »

У меня есть функция, которую я использую для создания глубоких копий основных объектов EF. Мне нужно это сделать, потому что мне нужна трассировка аудита, содержащая экземпляр объекта в том виде, в котором он существует в базе данных до сохранения, и экземпляр входящей версии, которая сохраняется.
Я я использую JsonSerializer.Serialize, а затем JsonSerializer.Deserialize для создания глубокой копии.
private static JsonSerializerOptions jsonOptions = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.IgnoreCycles,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
WriteIndented = false
};

public TEntity DeepCopy(TEntity entity)
{
string json = JsonSerializer.Serialize(entity, jsonOptions); //throws here
return JsonSerializer.Deserialize(json, jsonOptions);
}

Я ожидаю, что каждый вызов DeepCopy будет независимым и вся память будет освобождена после выхода из функции, но это не так. Если я поставлю точку останова на строку вывода, то примерно при седьмом вызове DeepCopy он выдаст исключение нехватки памяти и укажет, что пытается выделить более 2 ГБ памяти, предполагая, что что-то остается в памяти после каждого call.
Я попробовал переместить JsonSerializerOptions из вызова функции, как рекомендуется здесь: https://www.meziantou.net/avoid- Performance-issue-with-jsonserializer-by-reusing-the-same-instance-of-json.htm
К сожалению, этого не произошло работа. Я также попытался отсоединить объект, полагая, что он может потерять часть данных отслеживания состояния и, как следствие, стать меньше. Я также пытался принудительно выполнить сборку мусора, но это тоже не сработало.
public TEntity DeepCopy(TEntity entity)
{
db.Entry(entity).State = EntityState.Detached;
string json = JsonSerializer.Serialize(entity, jsonOptions);
GC.Collect();
GC.WaitForPendingFinalizers();
return JsonSerializer.Deserialize(json, jsonOptions);
}

Является ли весь мой метод сериализации/десериализации ошибочным способом глубокого копирования или есть какой-то способ использовать сериализацию JSON, не сталкиваясь с проблемами с памятью? Размер сериализованных объектов кажется довольно большим — 5 МБ каждый, что намного больше, чем должно быть.
В этом случае каждый объект представляет собой строку из таблицы Comp с полями:< /p>
Id int,
EmployeeId nvarchar FK
FiscalYear int FK
CompTypeId nvarchar FK
BonusId int FK
BaseSalaryId int FK
CompDate smalldatetime
CurrencyId nvarchar FK
Amount decimal
CreatedDate smalldatetime
LastUpdatedDate smalldatetime
LastUpdatedBy nvarchar FK
SourceId nvarchar FK


Подробнее здесь: https://stackoverflow.com/questions/792 ... iple-calls
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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