0

私は子供と一緒にクラスを持っています。すべての子には、ルート オブジェクトへの参照が必要です。オブジェクトを逆シリアル化するまで、すべてがうまくいっています。逆シリアル化が発生すると、逆シリアル化は子オブジェクトに対して New() を実行するため、SetParent が呼び出される前であっても、その子オブジェクトは新しいオブジェクトに置き換えられ、SetParent は呼び出されていません。したがって、逆シリアル化の後、私の子オブジェクトはどれも彼の親を知りません。オブジェクト Root は多くのアプリケーションで使用されており、これらのすべてのアプリケーションで SetParent を呼び出す必要はありません。

イベント AfterDeserialization を探しましたが、何も見つかりませんでした。リフレクションを調べましたが、親オブジェクトを見つける方法が見つかりませんでした。私は ISerializable を実装できることを見てきましたが、すべての逆シリアル化プロセスを管理するのは少し重いと思います (このオブジェクトには約 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

ご協力いただきありがとうございます!:o)

4

2 に答える 2

0

IXmlSerializableすべての作業を自分で実装して実行しない限り、XMLシリアル化を使用してこれを行うことはできません。

使用している.NETのバージョンによっては、同じオブジェクトへの複数の参照を処理できるため、「 NetDataContractSerializer 」を使用してみてください。

于 2011-03-08T19:56:51.487 に答える
0

親プロパティセッターで親を設定することは可能ですか?

親もシリアル化されている場合、逆シリアル化はセッターを呼び出します。

元:

   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
于 2011-03-08T20:02:29.663 に答える