我将自己实现一个IFormatter,但是我无法想到解决两种类型之间循环引用的方法,这两种类型都实现了ISerializable。
通常的模式如下:
我接着执行以下操作:
如果我使用现成的BinaryFormatter对b进行序列化和反序列化,那么上述引用相等性测试将返回true,正如我们所期望的那样。但是,在我的自定义IFormatter中,我无法想象任何实现这一点的方法。
在非ISerializable情况下,一旦解析目标引用,我可以简单地使用反射重新访问“pending”对象字段。但是,对于实现ISerializable的对象,不可能使用SerializationInfo注入新数据。
有人能指点我正确的方向吗?
通常的模式如下:
[Serializable]
class Foo : ISerializable
{
private Bar m_bar;
public Foo(Bar bar)
{
m_bar = bar;
m_bar.Foo = this;
}
public Bar Bar
{
get { return m_bar; }
}
protected Foo(SerializationInfo info, StreamingContext context)
{
m_bar = (Bar)info.GetValue("1", typeof(Bar));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("1", m_bar);
}
}
[Serializable]
class Bar : ISerializable
{
private Foo m_foo;
public Foo Foo
{
get { return m_foo; }
set { m_foo = value; }
}
public Bar()
{ }
protected Bar(SerializationInfo info, StreamingContext context)
{
m_foo = (Foo)info.GetValue("1", typeof(Foo));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("1", m_foo);
}
}
我接着执行以下操作:
Bar b = new Bar();
Foo f = new Foo(b);
bool equal = ReferenceEquals(b, b.Foo.Bar); // true
// Serialise and deserialise b
equal = ReferenceEquals(b, b.Foo.Bar);
如果我使用现成的BinaryFormatter对b进行序列化和反序列化,那么上述引用相等性测试将返回true,正如我们所期望的那样。但是,在我的自定义IFormatter中,我无法想象任何实现这一点的方法。
在非ISerializable情况下,一旦解析目标引用,我可以简单地使用反射重新访问“pending”对象字段。但是,对于实现ISerializable的对象,不可能使用SerializationInfo注入新数据。
有人能指点我正确的方向吗?