C#存储用于序列化的临时数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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完全成为一个类领域?

答案

想到的第一个也是最简单的事情是静态ConditionalWeakTableSee docs)。您还可以定期检查表以查看哪些对象仍处于活动状态,并从表中删除垃圾收集的对象。或者在物体的destructor中,让它们从桌子上移开。

以上是关于C#存储用于序列化的临时数据的主要内容,如果未能解决你的问题,请参考以下文章

Azure Data Lake 是不是仅临时存储用于分析的数据?

C ++禁止访问临时文件

Google Protocol Buffers 入门

oracle存储过程 中把临时表数据 返回结果集

用于从 cloudkit 检索单列的代码模式/片段

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?