I'm trying to create a class that will contain functions for serializing/deserializing objects to/from string. That's what it looks like now:
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 method works well, but DeserializeObject does not. I always get an exception with message "End of Stream encountered before parsing was completed". What may be wrong here?
The result of serializing an object with BinaryFormatter is an octet stream, not a string.
You can't just treat the bytes as characters like in C or Python.
Encode the serialized object with Base64 to get a string instead:
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());
}
}
and
public static object DeserializeObject(string str)
{
byte[] bytes = Convert.FromBase64String(str);
using (MemoryStream stream = new MemoryStream(bytes))
{
return new BinaryFormatter().Deserialize(stream);
}
}
Use UTF8 Base64 encoding instead of ASCII, for both encoding and decoding.
精彩评论