C#存储临时数据以进行序列化

时间:2018-09-21 14:21:24

标签: c# serialization deserialization

我正在实现使用.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()方法有时对于图元和其他不可枚举的类型可能是多余的,但是我试图通过引用子类等更复杂的类来使所有内容保持一致。 / p>

有了,这是我的问题:

我目前将临时数据存储在_serialData字段中。反序列化后,就不再需要该字段了。反序列化完成后,我可以很容易地清除该字段,但我宁愿将其作为范围变量存储在某个范围内的变量,该变量在不再需要时会进行垃圾收集。

我看到StreamingContext是与序列化构造函数和方法一起传递的,但是我不太了解它的用途,也看不到任何在其中存储临时数据的方法。

有没有办法避免完全将_serialData作为类字段?

1 个答案:

答案 0 :(得分:1)

首先想到的最简单的事情是静态ConditionalWeakTableSee docs)。您还可以定期检查表以查看哪些对象仍然存在,并从表中删除垃圾回收的对象。或者在对象的destructor中,让它们从表中删除。