使用 BinaryFormatter 序列化复杂对象

Serializing a complex object with BinaryFormatter

我正在尝试使用以下代码序列化一个包含 2 个复杂对象列表的复杂对象

public static byte[] SerializeObject(object obj)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream stream = new MemoryStream();
    formatter.Serialize(stream, obj);
    return stream.ToArray();
}

当我反序列化时,虽然我得到 NHibernate 异常,我的列表对象无法初始化,所以我怀疑它们一开始就没有被正确序列化。我收到的错误是未能延迟初始化某个对象的集合,没有会话或会话已关闭。

但是如果它们被正确序列化,那么就不需要延迟初始化,它们已经存在了,对吧?

这里可能发生的情况是您正在为集合序列化 NHibernate 代理。根据您的映射,出于性能原因,NHibernate 不会加载集合,直到您明确访问其元素为止。
它还能够为各种关联(称为 'lazy loading')执行此操作,其工作方式是 NHibernate 实际上实例化并使用实现正确接口(或派生自 类 的代理对象在其他协会的情况下)。

您可能已经知道所有这些,但我会根据上下文进行解释,以防您不知道。 如果您需要了解有关延迟加载的更多信息,请查看这篇文章:http://nhibernate.info/doc/howto/various/lazy-loading-eager-loading.html

在这种情况下,NHibernate 可能正在为您的列表使用代理,并且由于 BinaryFormatter 正在以非常规方式访问它们,这就是您最终序列化的方式。

如果是这种情况,您可以通过多种方式进行修复,具体取决于您构建项目的方式。

确认这是否解决了您的问题的一种快速方法是,在序列化您的对象之前继续并初始化其惰性属性(请注意,您需要对每个属性或递归执行此操作,因为 Initialize 方法只会加载您提供给它的代理的数据):

NHibernateUtil.Initialize(yourObject);
NHibernateUtil.Initialize(yourObject.List1);
NHibernateUtil.Initialize(yourObject.OtherList);
...etc...
SerializeObject(yourObject);