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
Передача Me в функции
Код:
Далее создал класс, пометил как сериализуемый. Далее в коде:
- в первом случае передаю в кач-ве первого параметра 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
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
Цитата: Metallord
В чём разница между передачей Me и ссылкой на объект такого же класса? Почему работает только второй вариант? :confused:
Потому что процедура десериализации затирает переданную ей ссылку (ByRef).
Рекомендация: сделайте процедуру десериализации статическим метдом, возвращающим объект. С полученным объектом работайте как хотите.
Цитата:
Рекомендация: сделайте процедуру десериализации статическим метдом, возвращающим объект.
Чем поможет использования статического метода в данной ситуации? :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
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
Цитата: Metallord
Чем поможет использования статического метода в данной ситуации? :rolleyes:
Тем что десериализация сродни конструктору. Создается объект из какого-то его представления.
Цитата: Metallord
Смысл в том, чтобы присвоить текущему экземпляру класса, другой экземпляр класса и сделать это внутри текущего класса.
Зачем такие страсти? Ссылку "Me" (this) изменить средствами языка невозможно.
Спасибо за помощь, пошёл другим путём. ;)