Двоичная сериализация и десериализация, не создавая файлы (через строки)

Я пытаюсь создать класс, который будет содержать функции для сериализации/десериализации объектов представить в виде строки. Это - то, на что это похоже теперь:

public class BinarySerialization
    {
        public static string SerializeObject(object o)
        {
            string result = "";

            if ((o.GetType().Attributes & TypeAttributes.Serializable) == TypeAttributes.Serializable)
            {
                BinaryFormatter f = new BinaryFormatter();
                using (MemoryStream str = new MemoryStream())
                {
                    f.Serialize(str, o);
                    str.Position = 0;

                    StreamReader reader = new StreamReader(str);
                    result = reader.ReadToEnd();
                }
            }

            return result;
        }

        public static object DeserializeObject(string str)
        {
            object result = null;

            byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
            using (MemoryStream stream = new MemoryStream(bytes))
            {
                BinaryFormatter bf = new BinaryFormatter();
                result = bf.Deserialize(stream);
            }

            return result;
        }
    }

Метод SerializeObject работает хорошо, но DeserializeObject не делает. Я всегда получаю исключение с сообщением "Конец Потока, с которым встречаются, прежде чем парсинг был завершен". Что может быть неправильным здесь?

19
задан the_V 18 May 2010 в 22:52
поделиться

2 ответа

Результатом сериализации объекта с помощью BinaryFormatter является поток октетов, а не строка.
Вы не можете просто рассматривать байты как символы, как в C или Python.

Закодируйте сериализованный объект с помощью Base64 , чтобы получить строку:

public static string SerializeObject(object o)
{
    if (!o.GetType().IsSerializable)
    {
        return null;
    }

    using (MemoryStream stream = new MemoryStream())
    {
        new BinaryFormatter().Serialize(stream, o);
        return Convert.ToBase64String(stream.ToArray());
    }
}

и

public static object DeserializeObject(string str)
{
    byte[] bytes = Convert.FromBase64String(str);

    using (MemoryStream stream = new MemoryStream(bytes))
    {
        return new BinaryFormatter().Deserialize(stream);
    }
}
44
ответ дан 30 November 2019 в 03:02
поделиться

Используйте кодировку UTF8 Base64 вместо ASCII как для кодирования, так и для декодирования.

0
ответ дан 30 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: