Написал две процедуры сериализация/десереализация:
- Код: Выделить всё
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 ссылку на текущий экземпляр класса, ошибок нет, но текущий экземпляр класса остаётся с теми же значениями, как до десериализации.
- во втором случае создаю и передаю ссылку tmpObj в кач-ве первого параметра EXT_LOAD_XML, ошибок нет, получаю экземпляр класса clsConnectionTest с данными после десериализации.
В чём разница между первым и вторым способом ведь в обоих случаях ссылка на один и тот же класс?
Мне требуется инициализировать текущий экземпляр класса первым способом, т.е. нужно чтобы работало 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