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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top