2

プラグインアーキテクチャのアプリケーションがあります。プラグインには独自のデータコンテナがあり、それらはすべてベースインターフェイスIPluginDataStorageから継承します。状態を保持するためにシリアル化されるDataStorageオブジェクトには、他のデータとともにこれらのサブクラスのリストが含まれています。DynamicTypeフラグはtrueに設定されています。これは、実行時にどのプラグインが使用されているかがわからないためです。

[Serializable]
[ProtoContract]
public class DataStorage
{
    [ProtoMember(200, DynamicType = true)]
    public List<IPluginDataContainer> PluginDataStorage { get; set; }

このセットアップをシリアル化すると問題なく動作しますが、リストを確実に逆シリアル化するのに問題があります。シリアル化されたときに使用されたすべてのプラグインにアクセスせずにオブジェクトを逆シリアル化しようとすると、当然、型が欠落しているという例外が発生します。

タイプを解決できません:NOSMemoryConsumptionPlugin.NOSMemoryConsumptionData、NOSMemoryConsumptionPlugin、Version = 1.2.0.17249、Culture = neutral、PublicKeyToken = null(TypeModel.DynamicTypeFormattingイベントを使用してカスタムマッピングを提供できます)

例外は、イベントを通じてフォーマットを提供できるというヒントを与えますが、問題はそのタイプが利用できないことであるため、それがどのように役立つかわかりません。このような場合に私がしたいのは、そのオブジェクトの逆シリアル化を完全に無視することです。このような場合、リストアイテムはデフォルトで基本クラスのダミーインスタンスになることもあります。しかし、これを行う方法は?

4

1 に答える 1

1

それ (スキップするかデフォルトにするかの選択) は、私が十分に検討したとは思えない魅力的な使用例です。ただし、次の方法で、おそらく自分でこれを行うことができます。

public class NilContainer : IPluginDataContainer {}

次に、 DynamicTypeFormattingイベントにサブスクライブします。タイプがわからない場合は、 を指定してくださいtypeof(NilContainer)

すなわち

RuntimeTypeModel.Default.DynamicTypeFormatting += (sender, args) =>
{
    Type type;
    if(!yourTypeMap.TryGetValue(args.FormattedName, out type))
    {
        type = typeof (NilContainer);
    }
    args.Type = type;
};

(完全に未テスト)

于 2012-05-25T14:27:59.650 に答える