2011-03-08 1 views
0

자식이있는 클래스가 있습니다. 모든 하위 항목에는 내 루트 객체에 대한 참조가 있어야합니다. 내가 물건을 비 직렬화 할 때까지 모든 것이 잘되고있다. deserialization이 발생하면 Deserialization은 자식 객체에서 New()를 수행하므로 SetParent가 호출되기 전에 자식 객체가 새 객체로 대체되고 SetParent가 호출되지 않은 경우에도 마찬가지입니다. 그래서 Deserialization 후, 내 자식 개체 중 누구도 그의 부모를 알지 못합니다. 개체 루트는 많은 응용 프로그램에서 사용하고 있으며 모든 응용 프로그램이 SetParent를 호출하는 것을 원하지 않습니다.자식이 자신의 부모를 참조하는 복잡한 형식의 비 직렬화 문제

나는 이벤트에 대한보고했습니다 AfterDeserialization 그러나 어떤을 발견하지 않았습니다. 리플렉션을 통해 살펴본 결과 부모 개체를 찾는 방법을 찾지 못했습니다. 나는 ISerializable을 구현할 수있는 것을 보았지만, 모든 deserialization 프로세스를 관리하기에는 무거웠다. (나는이 객체에서 약 170 개의 속성을 가진다.)

내가 이물질를 ISerializable과 그냥 내 setParent가 불려 갔을 때 함수를 호출, 모든 일 후에을 기본 메서드를 호출 할 수 있습니까? 아니면 내 연구에서 찾지 못한 객체의 인스턴스의 부모를 찾기 위해 반사되는 방법이 있습니까? 아니면 다른 제안이있는 사람이 있습니까?

Public Class Root 
    Private _a As Child1 
    Private _b As Child2 

    Public Property a() As Child1 
     Get 
      Return _a 
     End Get 
     Set(ByVal value As Child1) 
      _a = value 
     End Set 
    End Property 
    Public Property b() As Child2 
     Get 
      Return _b 
     End Get 
     Set(ByVal value As Child2) 
      _b = value 
     End Set 
    End Property 

    Public Sub New() 
     a = New Child1 
     b = New Child2 
     SetParent() 
    End Sub 

    Friend Sub SetParent() 
     a.SetParent(Me) 
     b.SetParent(Me) 
    End Sub 
End Class 

Public Class Child1 
    Private _parent As Root 

    Friend Sub SetParent(ByRef parent As Root) 
     _parent = parent 
    End Sub 
End Class 

Public Class Child2 
    Private _parent As Root 
    Private _a As New Child3 

    Public Property a() As Child3 
     Get 
      Return _a 
     End Get 
     Set(ByVal value As Child3) 
      _a = value 
     End Set 
    End Property 

    Friend Sub SetParent(ByRef parent As Root) 
     a = New Child3 
     _parent = parent 
     a.SetParent(parent) 
    End Sub 
End Class 

Public Class Child3 
    Private _parent As Root 

    Friend Sub SetParent(ByRef parent As Root) 
     _parent = parent 
    End Sub 
End Class 

도움 주셔서 감사합니다. : 당신이 자신을 IXmlSerializable를 구현하고 모든 일을하지 않는 O)

답변

0

는 부모 속성 setter의 부모를 설정 할 수 있습니까? 당신은 부모도 직렬화하는 경우

, 직렬화 복원은 세터를 호출합니다.

예는 :

Public Class Root 
     ... 
     Public Property a() As Child1 
     Get  
      Return _a  
     End Get 
     Set(ByVal value As Child1)  
      _a = value  
      _a.SetParent(Me) 
     End Set 
     End Property 
     ... 
    End Class 
+0

이 내가 필요 정확히입니다! 감사!! –

0

당신이 사용하는 XML 직렬화 할 수 없습니다.

는 사용중인 .NET 버전에 따라, 당신은 같은 객체에 대해 여러 참조를 처리 할 수 ​​있기 때문에, 'NetDataContractSerializer'를 사용하려고 할 수 있습니다.