C# хранит временные данные для сериализации
Я реализую иерархию классов, использующих встроенную сериализацию.NET. Из-за природы большинства этих классов и способа, которым.NET выполняет десериализацию с помощью десериализатора графа, мне нужно где-то хранить временные данные и ждать, пока они полностью десериализованы.
Все мои занятия в настоящее время включают что-то похожее на следующее:
class Example : ISerializable
{
private readonly dynamic _serialData = new ExpandoObject();
public ulong Id { get; private set; }
public string[] Strings { get; private set; }
protected Example( SerializationInfo info, StreamingContext context )
{
_serialData.Id = info.GetValue( nameof( Id ), typeof( ulong ) );
_serialData.Strings = info.GetValue( nameof( Strings ), typeof( string[] ) );
}
public void GetObjectData( SerializationInfo info, StreamingContext context )
{
info.AddValue( nameof( Id ), Id );
info.AddValue( nameof( Strings ), Strings );
}
[OnDeserialized]
private void OnDeserialized( StreamingContext context )
{
Id = _serialData.Id;
Strings = _serialData.Strings;
}
}
Я понимаю, что OnDeserialized()
Иногда метод может быть избыточным для примитивов и других не перечислимых типов, но я пытаюсь сохранить единообразие с более сложными классами, имеющими ссылки на дочерние классы и так далее.
С этим вот мой вопрос:
В настоящее время я храню временные данные в _serialData
поле. После десериализации в этом поле больше нет необходимости. Я мог бы легко очистить поле после завершения десериализации, но я бы предпочел, чтобы оно хранилось где-то в виде переменной области видимости, которая будет собирать мусор, когда она больше не нужна.
Я вижу, что StreamingContext
передается вместе с конструктором и методами сериализации, но я не совсем понимаю, для чего он используется, и я не вижу способа хранить в нем временные данные.
Есть ли способ, которым я могу избежать _serialData
как поле класса целиком?
1 ответ
Первая и самая легкая вещь, которая приходит на ум - это статический ConditionalWeakTable
( См. Документы). Вы также можете периодически проверять таблицу, чтобы увидеть, какие объекты еще живы, и удалить объекты из мусора из таблицы. Или в destructor
объектов, заставить их убрать себя со стола.