Я пытаюсь создать класс, который будет содержать функции для сериализации/десериализации объектов представить в виде строки. Это - то, на что это похоже теперь:
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 не делает. Я всегда получаю исключение с сообщением "Конец Потока, с которым встречаются, прежде чем парсинг был завершен". Что может быть неправильным здесь?
Результатом сериализации объекта с помощью 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);
}
}
Используйте кодировку UTF8 Base64 вместо ASCII как для кодирования, так и для декодирования.