C # Objekt Binary Serialisierung
-
20-09-2019 - |
Frage
Ich möchte eine binäre serialize eines Objekts machen und das Ergebnis in einer Datenbank zu speichern.
Person person = new Person();
person.Name = "something";
MemoryStream memorystream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(memorystream, person);
Wie ich Memory in einem String-Typ umwandeln kann in der Datenbank gespeichert werden, und danach der Lage sein, um das Objekt zu deserialisieren?
Lösung
Was du wirklich zu fragen, ist eine sichere Art und Weise beliebige binäre Daten als Text darzustellen und es dann wieder zurück zu konvertieren. Die Tatsache, dass es ein serialisierte Objekt speichert, ist irrelevant.
Die Antwort ist fast Base zu verwenden, 64 (zB Convert.ToBase64String
und Convert.FromBase64String
). Haben nicht Verwendung Encoding.UTF8.GetString
oder etwas ähnliches -. Ihre Binärdaten nicht codierten Textdaten und nicht als solche behandelt werden sollten
Allerdings ist die Datenbank hat nicht einen Datentyp für binäre Daten? Überprüfen Sie, ob BLOB, IMAGE und Binärdatentypen ...
Andere Tipps
Hier ist die Probe. TData müssen [Serializable] markiert werden und alle Felder geben auch.
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;
habe ich so etwas wie dieses
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());
Im Grunde nicht Speichern Sie die Daten als String in der Datenbank gibt es blob
Felder zur Verfügung binäre Daten zu speichern.
Wenn Sie wirklich die Daten als Zeichenfolge haben müssen, müssen Sie Ihr Byte konvertieren [] in einen String mit Base64-Codierung, und das Byte greifen [] aus einer String Verwendung Decodierung.
Haben Sie nicht sah in Umwandlung der Memorystream in eine base64hex Zeichenfolge in die Datenbank aufgenommen werden?
byte[] mStream = memorystream.ToArray();
string sConvertdHex = System.Convert.ToBase64String(mStream)
Dann können Sie den Inhalt sConvertdHex auf die Datenbank-Dump. Deserialisieren es müssen Sie die Rückseite
tun byte[] mData = System.Convert.FromBase64String(...)
dann zu Ihrem Objekt deserialisieren mdata zurück.