C # Объект двоичной сериализации - PullRequest
30 голосов
/ 17 ноября 2009

Я хочу сделать двоичную сериализацию объекта и результат, чтобы сохранить его в базе данных.

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

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

Как я могу преобразовать поток памяти в строковый тип для сохранения в базе данных и после этого, чтобы иметь возможность десериализации объекта?

Ответы [ 6 ]

52 голосов
/ 17 ноября 2009

То, что вы действительно запрашиваете, - это безопасный способ представления произвольных двоичных данных в виде текста и последующего их преобразования обратно. Тот факт, что он хранит сериализованный объект, не имеет значения.

Ответ почти на использование Base 64 (например, Convert.ToBase64String и Convert.FromBase64String). не используйте Encoding.UTF8.GetString или что-либо подобное - ваши двоичные данные являются не кодированными текстовыми данными и не должны рассматриваться как таковые.

Однако в вашей базе данных нет типа данных для двоичных данных? Проверьте типы BLOB, IMAGE и BINARY ...

37 голосов
/ 30 мая 2011

Вот образец. TData должна быть помечена как [Serializable], а также все поля должны быть набраны.

    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());
        }
    }
15 голосов
/ 04 января 2012
//-------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;
12 голосов
/ 17 ноября 2009

Я использовал что-то вроде этого

MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Person);
memoryStream.Flush();
memoryStream.Position = 0;
string value = Convert.ToBase64String(memoryStream.ToArray());
2 голосов
/ 17 ноября 2009

Как правило, не сохраняйте данные в виде строки в базе данных, есть поля blob для хранения двоичных данных.

Если вам действительно нужно иметь данные в виде строки, вам нужно преобразовать свой байт [] в строку, используя кодировку base64, и извлечь байт [] из строки, использующей декодирование.

0 голосов
/ 17 ноября 2009

Не задумывались ли вы о преобразовании потока памяти в строку base64hex для помещения в базу данных?

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

Затем вы можете сбросить содержимое sConvertdHex в базу данных. Для десериализации вам нужно сделать обратное

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

затем десериализовать mData обратно к вашему объекту.

...