我正在实现使用.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
作为类字段?
答案 0 :(得分:1)
首先想到的最简单的事情是静态ConditionalWeakTable
(See docs)。您还可以定期检查表以查看哪些对象仍然存在,并从表中删除垃圾回收的对象。或者在对象的destructor
中,让它们从表中删除。