Подтвердить что ты не робот

С# Object Binary Serialization

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Здесь образец. 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());
        }
    }

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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