c# – 使用BinaryFormatter反序列化序列化数据时的异常

我使用BinaryFormatter和MemoryStream来序列化对象,然后将其作为二进制blob存储在数据库中.然后,我从数据库中检索数据,并使用binaryformatter和内存流进行反序列化.

但是,当我尝试反序列化对象时,我经常会抛出异常.最值得注意的是“具有相同密钥的对象已存在”或“无法将字符串转换为int64”

有没有人知道为什么反序列化掷骰子?或者如何找出哪些字典对象有麻烦?

我的序列化功能如下……

private byte[] SerializeUserData(UserData ud)
{
    byte[] data = null;
    using (MemoryStream ms = new MemoryStream())
    {
        ms.Seek(0, SeekOrigin.Begin);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, ud);
        data = ms.ToArray();
    }
    return data;
}

private UserData Deserialize()
{
    UserData ud = null;
    using (MemoryStream ms = new MemoryStream(mSession.BinarySession))
    {
        BinaryFormatter bf = new BinaryFormatter();
        ud = bf.Deserialize(ms) as UserData;
    }
    return ud; 
}

UserData类有点像怪物,但它被标记为[serializable],其对象树中的所有类也被标记为[serializable].本课程的一部分如下:

[Serializable]
public class UserData
{
        public UserData() { Clear(); }
        public Guid Id { get; set; }

        public Account Account { get; set; }
        public List<Account> OldAccounts{ get; set; }

        public void Clear()
        {
          Account = null;
          OldAccounts = new List<Account>();
          Id = Guid.NewGuid();
        }
}

解决方法:

我没有在最近版本的框架中尝试过这个,但我认为经验法则可能仍然很好,不要使用具有自动属性的BinaryFormatter.

问题是,BinaryFormatter使用支持字段而不是用于执行序列化/反序列化的属性.对于自动属性,后备字段在编译时生成.而且每次都不保证是相同的.这可能意味着您反序列化您的对象,并且您没有准确地回复您放入的内容.

欲了解更多信息:Automatic Properties and the BinaryFormatter

上一篇:C#到Java:Base64String,MemoryStream,GZipStream


下一篇:c# – 来自MemoryStream的GZipStream只返回几百个字节