1

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

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

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 序列化/反序列化未知复杂性的 3rd 方对象?

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

4

1 回答 1

0

复杂性未知

不,基本上。这个序列化器是一个契约序列化器,并且不使用字段名称——所以它需要配置以确保数据保持安全和可反序列化。

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

是的

如果是这样,它是映射为子类型还是第二类型。

那要看; 它是序列化模型中使用的另一个 DTO 的子类型吗?还是它本身就存在?

在编译过程中仍然会出现错误,最明显的是“未知子类型”,但是异常并没有告诉我对象是哪个类型的子类型。

不过,它应该会告诉您未知类型是什么;快速测试给了我这样的信息:

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

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

于 2013-05-23T06:57:03.427 回答