C# 使用BinaryFormatter序列化复杂对象

C# 使用BinaryFormatter序列化复杂对象,c#,nhibernate,serialization,C#,Nhibernate,Serialization,我正在尝试使用下面的代码序列化一个包含两个复杂对象列表的复杂对象 public static byte[] SerializeObject(object obj) { BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, obj); return stream.ToArray()

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

public static byte[] SerializeObject(object obj)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream stream = new MemoryStream();
    formatter.Serialize(stream, obj);
    return stream.ToArray();
}
当我反序列化时,虽然我得到了NHibernate异常,但我的列表对象未能初始化,因此我怀疑它们一开始没有被正确序列化。我收到的错误是未能延迟初始化某个对象的集合,未关闭任何会话或会话


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

这里可能发生的事情是,您正在序列化集合的NHibernate代理。根据您的映射,出于性能原因,在您显式访问集合元素之前,NHibernate不会加载集合。 它还可以为各种类型的关联执行此操作,称为“延迟加载”,其工作方式是NHibernate实际实例化并使用代理对象,该对象实现正确的接口,或者在存在其他关联时从类派生

你可能已经知道了所有这些,但我会根据上下文解释,以防你不知道。 如果您需要了解有关延迟加载的更多信息,请参阅本文:

在这种情况下,NHibernate可能会对列表使用代理,而BinaryFormatter以一种非常规的方式访问列表,这就是您最终序列化的方式

如果是这样的话,有很多方法可以解决它,这取决于你如何构建你的项目

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

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

你是对的。另一方面,我在msdn上读到Serialize属性不应用于一般用途的序列化,而应使用DataContract属性。您对此有何看法?我只在WCF序列化的上下文中使用过DataContract,我是专门这样做的。对于一般用途的序列化,如用于存储到数据库中的序列化,如果需要,我仍然坚持使用classic属性和实现。但事实是,我对原因没有任何见解,因此我希望看到您提到的msdn文章/讨论的链接。请避免仅出于一般持久性原因而支持运行时序列化或XML序列化。更喜欢数据协定序列化