我正在尝试使用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
答案 0 :(得分:0)
基本上没有。此序列化程序是一个合同序列化程序,不使用字段名称 - 因此需要进行配置以确保数据保持安全且可反序列化。未知的复杂性
我是否需要将NHibernate.Mapping.PersistentClass添加到运行时类型模型中?
是
如果是,则将其映射为子类型或第二类型。
这取决于;它是序列化模型中使用的另一个DTO的子类型吗?还是它独立存在?
编译期间仍会出现错误,最明显的是“未知子类型”,但异常并不能告诉我该对象是哪种类型的子类型。
但它应该告诉你未知类型是什么;快速测试给我一些信息:
测试'Examples.Inheritance.UnknownSubtypeMessage'失败:System.InvalidOperationException:意外的子类型:Examples.Inheritance + B
从那里开始查找Examples.Inheritance.B
,应该清楚父类型是什么。