Escribí una clase personalizada MyClass
y la marqué con el atributo <Serializable()>
. Tengo un conjunto de archivos binarios en mi disco duro que he serializado utilizando BinaryFormatter
que provienen de instancias de MyClass
.¿Puedo deserializar un objeto cuando la clase subyacente se ha modificado ligeramente?
He cambiado recientemente la estructura de MyClass
ligeramente (añadido algunas propiedades, eliminado algunas propiedades, cambiado algunos métodos, etc.).
¿Qué pasa cuando trato de deserializar los objetos existentes para esta clase cambiada utilizando el código de abajo? Lo he intentado y no me han arrojado un error ni nada, pero seguramente no se puede deserializar correctamente cuando la clase ha cambiado. ¿Hay alguna manera de obtener información útil de los archivos serializados aunque haya actualizado la clase?
Gracias.
Aquí está el código que estoy usando para hacer la serialización:
Public Sub serializeObject(ByVal obj As Object, ByVal outFilename As String)
Dim fStream As FileStream
Try
fStream = New FileStream(outFilename, FileMode.Create)
Dim bfmtr As New BinaryFormatter
bfmtr.Serialize(fStream, obj)
fStream.Close()
Catch ex As Exception
MsgBox("Failed to serialize: " & ex.Message)
Throw
End Try
End Sub
Y para hacer la deserialización que estoy usando:
myObj = CType(deserializeObject("C:\myobject.bin"), MyClass))
Dónde deserializeObject
es:
Public Function deserializeObject(ByVal srcFilename As String) As Object
If File.Exists(srcFilename) Then
Dim fStream As Stream = File.OpenRead(srcFilename)
Dim deserializer As New BinaryFormatter
Dim returnObject As Object = deserializer.Deserialize(fStream)
fStream.Close()
Return returnObject
Else
Throw New ApplicationException("File not found: " & srcFilename)
End If
End Function
Si quita campos, recibirá un error si existe la propiedad de los datos serializados. Agregar campos debería estar bien. Tampoco puede cambiar la versión de ensamblaje # o la clave de denominación fuerte, ya que también provocarán la deserialización. –
@Robert. Estás completamente equivocado acerca de esto. Si se exigiera que cada propiedad existiera en el formato serializado, entonces no tendríamos atributos de contrato de datos como [IgnoreDataMember]. – BentOnCoding
Esta es una serialización binaria. Tiene razón cuando se refiere a la serialización XML, pero la serialización binaria fallará en la deserialización si elimina una propiedad de un objeto después de la serialización. –