第一次玩C#中的序列化…任何帮助将不胜感激!
以下是我的通用序列化器和反序列化器:
以下是我的通用序列化器和反序列化器:
- public static string SerializeObject<T>(T objectToSerialize)
- {
- BinaryFormatter bf = new BinaryFormatter();
- MemoryStream memStr = new MemoryStream();
- try
- {
- bf.Serialize(memStr,objectToSerialize);
- memStr.Position = 0;
- return Convert.ToBase64String(memStr.ToArray());
- }
- finally
- {
- memStr.Close();
- }
- }
- public static T DeserializeObject<T>(string str)
- {
- BinaryFormatter bf = new BinaryFormatter();
- byte[] b = System.Text.Encoding.UTF8.GetBytes(str);
- MemoryStream ms = new MemoryStream(b);
- try
- {
- return (T)bf.Deserialize(ms);
- }
- finally
- {
- ms.Close();
- }
- }
这是我尝试序列化的对象:
- [Serializable()]
- class MatrixSerializable : ISerializable
- {
- private bool markerFound;
- private Matrix matrix;
- public MatrixSerializable( Matrix m,bool b)
- {
- matrix = m;
- markerFound = b;
- }
- public MatrixSerializable(SerializationInfo info,StreamingContext ctxt)
- {
- markerFound = (bool)info.GetValue("markerFound",typeof(bool));
- matrix = Matrix.Identity;
- if (markerFound)
- {
- //deserialization code
- }
- }
- public void GetObjectData(SerializationInfo info,StreamingContext ctxt)
- {
- // serialization code
- }
- public Matrix Matrix
- {
- get { return matrix; }
- set { matrix = value; }
- }
- public bool MarkerFound
- {
- get { return markerFound; }
- set { markerFound = value; }
- }
- }
以及如何运行它的示例:
- MatrixSerializable ms = new MatrixSerializable(Matrix.Identity * 5,true);
- string s = Serializer.SerializeObject<MatrixSerializable>(ms);
- Console.WriteLine("serialized: " + s);
- ms = Serializer.DeserializeObject<MatrixSerializable>(s);
- Console.WriteLine("deserialized: " + ms.Matrix + " " + ms.MarkerFound);
当我尝试运行它时,我得到一个错误“SerializationException未处理:输入流不是有效的二进制格式.起始内容(以字节为单位)是:41-41-45-41-41-41-44-2F- 2F-2F-2F-2F-41-51-41-41-41 ……“
关于我做错了什么或如何解决这个问题的任何建议将不胜感激!
解决方法
您正在使用Base64将字节数组转换为字符串,并使用GetUtf8字节将字符串转换回字节数组.
替换System.Text.Encoding.UTF8.GetBytes(str);与Convert.FromBase64String(str);