使用BinaryFormatter序列化复杂对象

时间:2015-03-24 15:55:38

标签: c# nhibernate serialization

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

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

当我反序列化时虽然我得到了我的列表对象无法初始化的NHibernate异常,所以我怀疑它们还没有被正确序列化。我收到的错误是没有懒惰地初始化某个对象的集合,没有关闭会话或会话。

但如果它们被正确序列化,则不需要懒惰地初始化,它们已经存在,对吧?

1 个答案:

答案 0 :(得分:0)

这里可能发生的是您正在为集合序列化NHibernate代理。根据您的映射,出于性能原因,NHibernate在您明确访问其元素之前不会加载集合 它也可以为各种关联(它被称为'延迟加载')执行此操作,它的工作方式是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);