4

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

但是,当我尝试反序列化对象时,我经常会抛出异常。最显着'an object with the same key already exists''cannot convert string to 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();
        }
}
4

1 回答 1

5

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

问题是,BinaryFormatter 使用支持字段而不是进行序列化/反序列化的属性。在自动属性的情况下,支持字段是在编译时生成的。而且不保证每次都一样。这可能意味着您反序列化了您的对象,而您并不能准确地返回您输入的内容。

有关更多信息,请阅读:自动属性和 BinaryFormatter

于 2010-12-17T19:16:01.197 回答