serializar objeto c#
C#Object Serialización binaria (6)
Quiero hacer una serialización binaria de un objeto y el resultado para guardarlo 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 el flujo de memoria en un tipo de cadena para guardarlo en la base de datos, y después de esto poder deserializar el objeto?
¿No has buscado convertir la corriente de memoria en una cadena de base64hex para poner en la base de datos?
byte[] mStream = memorystream.ToArray();
string sConvertdHex = System.Convert.ToBase64String(mStream)
Luego puede volcar los contenidos sConvertdHex a la base de datos. Para deserializarlo necesitas hacer lo contrario
byte[] mData = System.Convert.FromBase64String(...)
luego deserialize mData de vuelta a su objeto.
Aquí está la muestra. TData debe marcarse [Serializable] y todos los campos escribir 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());
}
}
Básicamente, no guarde los datos como cadenas en la base de datos, hay campos blob
disponibles para almacenar datos binarios.
Si realmente necesita tener los datos como una cadena, necesitará convertir su byte [] a una cadena usando la codificación base64, y para tomar el byte [] de una cadena usar la decodificación.
Lo que realmente está pidiendo es una forma segura de representar datos binarios arbitrarios como texto y luego convertirlos de nuevo. El hecho de que almacene un objeto serializado es irrelevante.
La respuesta es casi usar Base 64 (por ejemplo, Convert.ToBase64String
y Convert.FromBase64String
). No utilice Encoding.UTF8.GetString
ni nada similar: sus datos binarios no son datos de texto codificados y no deben tratarse como tales.
Sin embargo, ¿tu base de datos no tiene un tipo de datos para datos binarios? Compruebe si hay tipos BLOB, IMAGE y BINARY ...
Usé 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());
//-------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;