BinaryFormatter 実装を protobuf-net と交換しようとしています。ユースケースは、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 を追加する必要がありますか? その場合、サブタイプまたは 2 番目のタイプとしてマップされますか。プロジェクトをコンパイルすると、次のすべてのタイプで同様のエラーが発生します。
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 を置き換えることです:
オブジェクトのシリアル化による nHibernate の起動の高速化