Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Проблемы с Серелизацией Добавлено: 23.09.04 14:59  

Автор вопроса:  danser | ICQ: 299287824 
Есть два простых класа. Причем поле класа B имеет тип А.

<Serializable()> Public Class A
    Public Event EventA()
    Private A1_ As String
    Public Property A1() As String
        Get
            A1 = Me.A1_
        End Get
        Set(ByVal Value As String)
            Me.A1_ = Value
            RaiseEvent EventA()
        End Set
    End Property
End Class

<Serializable()> Public Class B
    Private WithEvents B1_ As New A()
    Public Property B1() As A
        Get
            B1 = Me.B1_
        End Get
        Set(ByVal Value As A)
            Me.B1_ = Value
        End Set
    End Property
    Private Sub B1__EventA() Handles B1_.EventA
        MsgBox("Поле B2 изменено")
    End Sub
End Class

Стандартные операции для сохранения в файле:
Dim saveFile As FileStream
        saveFile = File.Create(Path)
        Dim BFormatter As New BinaryFormatter()
        BFormatter.Serialize(saveFile, CType(Me.Obj, B))
        saveFile.Close()
и открития из файла:
Dim openFile As FileStream
        openFile = File.OpenRead(Path)
        Dim BFormatter As New BinaryFormatter()
        Dim OpenB As New B()
        OpenB = CType(BFormatter.Deserialize(openFile), B)
        openFile.Close()

При сохранении вроде нормально, при откритии матерится. Вот мат:
Serialization will not deserialize delegates to non-public methods.

Если клас В писать так то нормально и сохраняет и откривает:

<Serializable()> Public Class B
    Private B1_ As New A()
    Public Property B1() As A
        Get
            B1 = Me.B1_
        End Get
        Set(ByVal Value As A)
            Me.B1_ = Value
        End Set
    End Property
End Class

Но мне надо отслеживать если меняется свойство B1 класа B.
ВОПРОС: В чем тут проблема?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 23.09.04 15:26
Он не может сериализовать делегат... И это в принципе правильно.

Наверное, надо изменить логику сериализации, запретив сериализовать
делегат, а делегат создавать вручную после десериализации.

Ответить

Номер ответа: 2
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #2 Добавлено: 23.09.04 19:37
Что такое д е л е г а т ?
(Ссылочку там или в двух словах если не трудно...)

Ответить

Номер ответа: 3
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 24.09.04 09:11
Грубо говоря, это ссылка на функцию.
Почитай в MSDN.....


Ответить

Номер ответа: 4
Автор ответа:
  Артём Л.



ICQ: 280044491 

Вопросов: 43
Ответов: 227
 Профиль | | #4 Добавлено: 24.09.04 11:26
делегат это действительно выполняет функцию по ее ссылке...
на самом деле, делегат - это класс, который имеет методы Invoke,
BegineInvoke, EndInvoke, которые и служат для вызова этой функции



Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам