【问题标题】:C# storing temporary data for serializationC# 存储用于序列化的临时数据
【发布时间】:2018-09-21 14:21:23
【问题描述】:

我正在实现使用 .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 作为类字段?

【问题讨论】:

标签: c# serialization deserialization


【解决方案1】:

首先想到的也是最简单的事情是静态ConditionalWeakTable (See docs)。您还可以定期检查表以查看哪些对象还活着,并从表中删除垃圾收集的对象。或者在对象的destructor 中,让它们将自己从表中移除。

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多