C # хранит временные данные для сериализации - PullRequest
0 голосов
/ 21 сентября 2018

Я реализую иерархию классов, использующих встроенную сериализацию .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 Ответ

0 голосов
/ 21 сентября 2018

Первая и самая простая вещь, которая приходит на ум, - это статическая ConditionalWeakTable ( См. Документы ).Вы также можете периодически проверять таблицу, чтобы увидеть, какие объекты еще живы, и удалить объекты из мусора из таблицы.Или в destructor объектов, заставьте их удалить себя из таблицы.

...