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

是否可以在父属性设置器中设置父级?

如果您的父级也是序列化,则反序列化将调用 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
于 2011-03-08T20:02:29.663 回答