1

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 の起動の高速化

4

1 に答える 1

0

未知の複雑さ

いいえ、基本的に。このシリアライザーはコントラクト シリアライザーであり、フィールド名を使用しないため、データが安全で逆シリアル化可能であることを確認するための構成が必要です。

ランタイム型モデルに NHibernate.Mapping.PersistentClass を追加する必要がありますか?

はい

その場合、サブタイプまたは 2 番目のタイプとしてマップされますか。

場合によります; シリアル化モデルで使用される別の DTO のサブタイプですか? それとも自立しますか?

コンパイル中にエラーが引き続き発生します。最も顕著なのは「サブタイプが不明です」ですが、例外はオブジェクトがどのタイプのサブタイプであるかを教えてくれません。

ただし、不明なタイプが何であるかがわかります。簡単なテストでは、次のようなメッセージが表示されます。

テスト 'Examples.Inheritance.UnknownSubtypeMessage' が失敗しました: System.InvalidOperationException: 予期しないサブタイプ: Examples.Inheritance+B

そこから、見上げるとExamples.Inheritance.B、親の型が何であるかが明確になるはずです。

于 2013-05-23T06:57:03.427 に答える