使用protobuf-net序列化NHibernate.Configuration

时间:2013-05-22 23:14:03

标签: c# nhibernate serialization deserialization protobuf-net

我正在尝试使用protobuf-net交换BinaryFormatter实现。用例是能够序列化和反序列化NHibernate.Configuration对象。 “配置”对象很复杂,我们无法用属性来装饰它。我们将类型添加到运行时类型模型中,但该对象未被序列化(文件为0字节)。

首先,我将配置类型添加到运行时类型模型中:

model.Add(typeof(NHibernate.Cfg.Configuration), false)

这没用,所以我添加了所有属性:

model.Add(typeof(NHibernate.Cfg.Configuration), false)
     .Add("ClassMappings",
          "CollectionMappings",
          "EntityNotFoundDelegate",
          "EventListeners",
          "Imports",
          "Interceptor",
          "NamedQueries",
          "NamedSQLQueries",
          "NamingStrategy",
          "Properties",
          "SqlFunctions",
          "SqlResultSetMappings");

由于我现在收到如下错误,但仍然无法正常工作:

  

没有为类型定义的序列化程序:NHibernate.Mapping.PersistentClass

我是否需要将NHibernate.Mapping.PersistentClass添加到运行时类型模型中?如果是,则将其映射为子类型或第二类型。编译项目会导致以下所有类型的类似错误:

RuntimeTypeModel.Default.Add(typeof(NHibernate.IInterceptor), false);
RuntimeTypeModel.Default.Add(typeof(NHibernate.Mapping.RootClass), false);
RuntimeTypeModel.Default.Add(typeof(NHibernate.Mapping.Collection), false);
RuntimeTypeModel.Default.Add(typeof(NHibernate.Cfg.INamingStrategy), false);
RuntimeTypeModel.Default.Add(typeof(NHibernate.Event.EventListeners), false);
RuntimeTypeModel.Default.Add(typeof(NHibernate.Mapping.PersistentClass), false);
RuntimeTypeModel.Default.Add(typeof(NHibernate.Proxy.IEntityNotFoundDelegate), false);

将这些类型添加到运行时类型模型不起作用。编译过程中仍会出现错误,最明显的是“子类型未知”,但异常并不能告诉我该对象是哪种类型的子类型。

是否有更简单的方法让protobuf-net序列化/反序列化未知复杂性的第三方对象?

这个问题的动机是在以下用例中替换BinaryFormatter:
Speed Up nHibernate Startup With Object Serialization

1 个答案:

答案 0 :(得分:0)

  

未知的复杂性

基本上没有。此序列化程序是一个合同序列化程序,不使用字段名称 - 因此需要进行配置以确保数据保持安全且可反序列化。

  

我是否需要将NHibernate.Mapping.PersistentClass添加到运行时类型模型中?

  

如果是,则将其映射为子类型或第二类型。

这取决于;它是序列化模型中使用的另一个DTO的子类型吗?还是它独立存在?

  

编译期间仍会出现错误,最明显的是“未知子类型”,但异常并不能告诉我该对象是哪种类型的子类型。

但它应该告诉你未知类型是什么;快速测试给我一些信息:

  

测试'Examples.Inheritance.UnknownSubtypeMessage'失败:System.InvalidOperationException:意外的子类型:Examples.Inheritance + B

从那里开始查找Examples.Inheritance.B,应该清楚父类型是什么。