Pregunta

Quiero hacer una serialización binaria de un objeto y el resultado para guardarla en una base de datos.

Person person = new Person();
person.Name = "something";

MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);

¿Cómo puedo transformar MemoryStream en un tipo de cadena que se guardan en la base de datos, y después de esto para poder deserializar el objeto?

¿Fue útil?

Solución

Lo que estás a realmente pidiendo es una manera segura de representar datos binarios arbitrarios como el texto y luego convertir de nuevo otra vez. El hecho de que se almacena un objeto serializado es irrelevante.

La respuesta es casi utilizar Base 64 (por ejemplo Convert.ToBase64String y Convert.FromBase64String ). Hacer no Encoding.UTF8.GetString uso o algo similar -. Sus datos binario es no los datos de texto codificados, y no debe ser tratado como tal

Sin embargo, no su base de datos no tiene un tipo de datos para los datos binarios? Compruebe si hay BLOB, Imagen y tipos binarios ...

Otros consejos

Aquí está la muestra. TData debe estar marcado [Serializable] y todos los campos tipo también.

    private static TData DeserializeFromString<TData>(string settings)
    {
        byte[] b = Convert.FromBase64String(settings);
        using (var stream = new MemoryStream(b))
        {
            var formatter = new BinaryFormatter();
            stream.Seek(0, SeekOrigin.Begin);
            return (TData)formatter.Deserialize(stream);
        }
    }

    private static string SerializeToString<TData>(TData settings)
    {
        using (var stream = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, settings);
            stream.Flush();
            stream.Position = 0;
            return Convert.ToBase64String(stream.ToArray());
        }
    }
//-------write to database-------------------------
Person person = new Person();
person.name = "Firstnm  Lastnm";
MemoryStream memorystream = new MemoryStream(); 
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
byte[] yourBytesToDb = memorystream.ToArray();
//here you write yourBytesToDb to database


//----------read from database---------------------
//here you read from database binary data into yourBytesFromDb
MemoryStream memorystreamd = new MemoryStream(yourBytesFromDb);
BinaryFormatter bfd = new BinaryFormatter();
Person deserializedperson = bfd.Deserialize(memorystreamd) as Person;

he usado algo como esto

MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());

Básicamente, No guardar los datos como cadena a la base de datos, hay campos de blob disponibles para almacenar datos binarios.

Si realmente necesita tener los datos como cadena, que necesita para convertir su byte [] en una cadena mediante la codificación base64, y para agarrar el byte [] a partir de una decodificación uso de cadenas.

¿No has mirado en la conversión de la MemoryStream en una cadena base64hex a ser puesto en la base de datos?

 byte[] mStream = memorystream.ToArray();
 string sConvertdHex = System.Convert.ToBase64String(mStream)

A continuación, puede volcar el contenido sConvertdHex a la base de datos. Deserializar lo que hay que hacer a la inversa

 byte[] mData = System.Convert.FromBase64String(...)

A continuación, deserializar MDATA de nuevo a su objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top