none
Serialización y deserialización por otra aplicación RRS feed

  • Pregunta

  • Estimados,

    Con una aplicación, serializo una lista de estructura:

       Public Sub Guardar_array(nombre, dato)
            ' Guarda las estructuras dato en archivo NOMBRE
            Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            Dim fStream As New IO.FileStream(nombre, IO.FileMode.OpenOrCreate)
            Try
                BF.Serialize(fStream, dato) ' escribe a un archivo con la serialización de dato
                fStream.Close()
            Catch
                MsgBox(Err.Description)
            End Try
        End Sub

    Con otra aplicación, pretendo leer el archivo:

        Public Function Cargar_array(nombre, ByRef dato) As Boolean
            ' Recupera las estructuras dato en archivo NOMBRE, en la carpeta CARPETA_DATOS
            Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            Dim fStream As New IO.FileStream(nombre, IO.FileMode.Open)
            Try
                fStream.Position = 0 ' resetea stream pointer (no es necesario)
                dato = BF.Deserialize(fStream) ' lee de un archivo
                Cargar_array = True
            Catch
                MsgBox(Err.Description)
                Cargar_array = False
            End Try
        End Function

    Esto funciona perfectamente dentro de la MISMA aplicación. Pero cuando trato de leer con Cargar_array un archivo guardado previamente por otra aplicación con Guardar_array, obtengo un error.

    Aclaro que dato es un tipo List(of estructura) donde estructura tiene el atributo <Serializable>

    Aprecio su ayuda!

    Gracias


    Daniel_tango

    lunes, 28 de agosto de 2017 19:59

Respuestas

  • Estás usando el "Runtime Serialization". Este tipo de serialización verifica que la clase que deserializas sea LA MISMA que serializaste. Aquí "La misma" no significa solo "que tenga el mismo nombre y los mismos campos". Además tiene que tener el mismo espacio de nombres. Cerciórate de que en los dos proyectos el tipo "estructura" tiene el mismo espacio de nombres. Y además, si tus proyectos tienen un Strong Name, éste y el número de versión también tienen que coincidir en los dos proyectos. Una buena forma de que los dos proyectos no se "desincronicen", y se garantice que el tipo siempre sea el mismo, es poner ese tipo en una DLL y que los dos proyectos referencien la misma DLL.

    Si ese cambio no es factible, entonces tal vez te convenga renunciar al Runtime Serialization, y usar en su lugar, por ejemplo, una serialización XML o serialización JSON.

    martes, 29 de agosto de 2017 7:03
  • Debo comentar que, en la serialización, debía guardar una variable del tipo Color. Ahí descubrí que no se puede hacer en forma directa en un archivo XML. Tuve que apelar a algún truco, hasta que descubrí  

    variable_Int32 = Variable_Color.ToArgb() y su inversa.

    variable_Color = Color.FromArgb(variable_Int32).

    Creo que con este método y función me podré manejar bien.

    Saludos


    Daniel_tango

    martes, 29 de agosto de 2017 18:28

Todas las respuestas

  • Estás usando el "Runtime Serialization". Este tipo de serialización verifica que la clase que deserializas sea LA MISMA que serializaste. Aquí "La misma" no significa solo "que tenga el mismo nombre y los mismos campos". Además tiene que tener el mismo espacio de nombres. Cerciórate de que en los dos proyectos el tipo "estructura" tiene el mismo espacio de nombres. Y además, si tus proyectos tienen un Strong Name, éste y el número de versión también tienen que coincidir en los dos proyectos. Una buena forma de que los dos proyectos no se "desincronicen", y se garantice que el tipo siempre sea el mismo, es poner ese tipo en una DLL y que los dos proyectos referencien la misma DLL.

    Si ese cambio no es factible, entonces tal vez te convenga renunciar al Runtime Serialization, y usar en su lugar, por ejemplo, una serialización XML o serialización JSON.

    martes, 29 de agosto de 2017 7:03
  • Gracias Alberto!

    Sin cambiar demasiado los procedimientos, he probado exitosamente con serialización XML.

    Cordialmente


    Daniel_tango

    martes, 29 de agosto de 2017 10:54
  • Debo comentar que, en la serialización, debía guardar una variable del tipo Color. Ahí descubrí que no se puede hacer en forma directa en un archivo XML. Tuve que apelar a algún truco, hasta que descubrí  

    variable_Int32 = Variable_Color.ToArgb() y su inversa.

    variable_Color = Color.FromArgb(variable_Int32).

    Creo que con este método y función me podré manejar bien.

    Saludos


    Daniel_tango

    martes, 29 de agosto de 2017 18:28