Двоичная Сериализация Объектов C#

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

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

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

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

6 ответов


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

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

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


вот пример. 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());
        }
    }

//-------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;

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

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

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

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


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

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

затем вы можете сбросить содержимое sConvertdHex в базу данных. Чтобы десериализовать его, вам нужно сделать обратное

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

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