Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача Me в функции

63K
09 декабря 2010 года
Metallord
9 / / 09.12.2010
Написал две процедуры сериализация/десереализация:

Код:
Public Sub EXT_LOAD_XML(ByRef p_OBJECT As Object, ByVal p_PATH As String, ByVal p_TYPE As Type)
        Dim objFileStream As FileStream = New FileStream(p_PATH, FileMode.Open)
        Dim objXmlDictionaryReader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(objFileStream, Encoding.UTF8, New XmlDictionaryReaderQuotas(), Nothing)
        Dim objSerializer As DataContractSerializer = New DataContractSerializer(p_TYPE)
        p_OBJECT = objSerializer.ReadObject(objXmlDictionaryReader, True)
        objXmlDictionaryReader.Close()
        objFileStream.Close()
    End Function

    Public Sub EXT_SAVE_XML(ByRef p_OBJECT As Object, ByVal p_PATH As String, ByVal p_TYPE As Type)
        Dim objXmlTextWriter As XmlTextWriter = New XmlTextWriter(p_PATH, Encoding.UTF8)
        objXmlTextWriter.Formatting = Formatting.Indented
        Dim objXmlDictionaryWriter As XmlDictionaryWriter = XmlDictionaryWriter.CreateDictionaryWriter(objXmlTextWriter)
        Dim objSerializer As DataContractSerializer = New DataContractSerializer(p_TYPE)
        objSerializer.WriteObject(objXmlDictionaryWriter, p_OBJECT)
        objXmlDictionaryWriter.Close()
        objXmlTextWriter.Close()
    End Sub


Далее создал класс, пометил как сериализуемый. Далее в коде:
- в первом случае передаю в кач-ве первого параметра EXT_LOAD_XML ссылку на текущий экземпляр класса - Me, ошибок нет, но текущий экземпляр класса остаётся с теми же значениями, как до десериализации. :confused:
- во втором случае создаю и передаю ссылку tmpObj в кач-ве первого параметра EXT_LOAD_XML, ошибок нет, получаю экземпляр класса clsConnectionTest с данными после десериализации. :)

В чём разница между передачей Me и ссылкой на объект такого же класса? Почему работает только второй вариант? :confused: Мне требуется инициализировать текущий экземпляр класса первым способом, т.е. нужно чтобы работало Me=objSerializer.ReadObject(objXmlDictionaryReader, True).

Код:
<Serializable()> Public Class clsConnectionTest
    Private Const ConfigPath As String = ".\Configs\connections_config.cfg"

    Public PingTimeout As Integer = 2000
    Public EquipmentAddresses As List(Of IPAddress) = New List(Of IPAddress)

    Public Sub Init(Optional ByVal p_CFG_PATH As String = ConfigPath)
            '1 вариант
            EXT_LOAD_XML(Me, ConfigPath, [GetType])        'Десериализация происходит правильно, ставил точки останова в EXT_LOAD_XML, но после выполнения это ф-ии, текущий экземпляр класса остаётся с теми же значениями свойств, которые были до вызова ф-ии
            '2 вариант рабочий
            Dim tmpObj As clsConnectionTest
            EXT_LOAD_XML(tmpObj, ConfigPath, [GetType])
            With tmpObj
                PingTimeout = .PingTimeout
                EquipmentAddresses = .EquipmentAddresses
            End With
    End Sub
End Class
5
10 декабря 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Metallord

В чём разница между передачей Me и ссылкой на объект такого же класса? Почему работает только второй вариант? :confused:


Потому что процедура десериализации затирает переданную ей ссылку (ByRef).

Рекомендация: сделайте процедуру десериализации статическим метдом, возвращающим объект. С полученным объектом работайте как хотите.

63K
10 декабря 2010 года
Metallord
9 / / 09.12.2010
Цитата:
Рекомендация: сделайте процедуру десериализации статическим метдом, возвращающим объект.



Чем поможет использования статического метода в данной ситуации? :rolleyes:

Цитата:
С полученным объектом работайте как хотите.



Смысл в том, чтобы присвоить текущему экземпляру класса, другой экземпляр класса и сделать это внутри текущего класса.

Код:
...
Shared Function Deserialize() As X
      Return New X
End Function
...


Public Class X
       Sub New
            Me=Deserialize()   'Это естественно не работает, 'Me' cannot be the target of an assignment.
       End Sub
End Class
Вот чем заменить этот самый Me? :rolleyes:
5
10 декабря 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Metallord
Чем поможет использования статического метода в данной ситуации? :rolleyes:

Тем что десериализация сродни конструктору. Создается объект из какого-то его представления.

Цитата: Metallord
Смысл в том, чтобы присвоить текущему экземпляру класса, другой экземпляр класса и сделать это внутри текущего класса.

Зачем такие страсти? Ссылку "Me" (this) изменить средствами языка невозможно.

63K
25 декабря 2010 года
Metallord
9 / / 09.12.2010
Спасибо за помощь, пошёл другим путём. ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог