Проблема десериализации со сложным типом, что childs имеет ссылку на своего родителя - PullRequest
0 голосов
/ 08 марта 2011

У меня есть класс с детьми. Все дочерние элементы должны иметь ссылку на мой корневой объект. Все идет хорошо, пока я не десериализую свой объект. Когда происходит десериализация, десериализация выполняет 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

Спасибо за вашу помощь! : О)

Ответы [ 2 ]

0 голосов
/ 08 марта 2011

Возможно ли установить родителя в установителе родительского свойства?

Если ваш родитель тоже сериализуется, десериализация вызовет установщик.

0 голосов
/ 08 марта 2011

Вы не можете сделать это с помощью XML-сериализации, если вы не внедрили IXmlSerializable и не сделали всю работу самостоятельно.

В зависимости от того, какую версию .NET вы используете, вы можете попробовать использовать ' NetDataContractSerializer ', поскольку он может обрабатывать несколько ссылок на один и тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...