У меня есть функция, которую я использую для создания глубоких копий основных объектов 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
JsonSerializer.Serialize вызывает исключение нехватки памяти после нескольких вызовов ⇐ C#
Место общения программистов C#
1732725636
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79231150/jsonserializer-serialize-causes-out-of-memory-exception-after-multiple-calls[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия