내 자신의 IFormatter 구현을 작성 중이므로 둘 다 ISerializable을 구현하는 두 형식 사이에서 순환 참조를 해결할 방법을 생각할 수 없습니다. I에는 직렬화 및 deserialise의 B, 위 테스트하기 위해 아웃 - 오브 - 박스 경우 BinaryFormatter를 사용하는 경우ISerializable을 구현하는 개체에 대한 순환 참조 해결
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);
:
[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);
}
}
내가 다음을 수행하십시오
여기에 일반적인 패턴이다 참조 평등은 기대했던대로 true를 반환합니다. 하지만 내 사용자 정의 IFormatter에서 이것을 달성 할 수있는 방법을 생각할 수 없습니다.
비 ISerializable 상황에서 간단히 대상 참조가 해결되면 반사를 사용하여 "보류 중"개체 필드를 다시 방문 할 수 있습니다. 그러나 ISerializable을 구현하는 객체의 경우 SerializationInfo를 사용하여 새 데이터를 주입 할 수 없습니다.
누구나 올바른 방향으로 나를 가리킬 수 있습니까?
본인은 "참조 태그"에 대한 귀하의 요지를 알고 있으며 제 형식 기는이 기술을 이미 사용하고 있습니다. 그러므로 당신의 자기 참조 예제는 저에게 문제가되지 않습니다. 그러나 당신의 답이 어떻게 서로를 참조하는 ISerializable 구현 객체로 나를 돕는 지 알지 못합니다. 이 특정 문제를 해결할 수 있습니까? 감사. – Chris
무슨 뜻인지 전혀 모르겠다. 직렬화와 관련된 개인 생성자를 사용하는 것에 대해 이야기하고 있습니까? –
예, 정확하게. ISerializable을 구현 한 객체를 확장하는 유일한 방법은 특수 생성자를 호출하는 것입니다. – Chris