2012-01-24 1 views
1

ProtoBuf-Netを使用して、以前の種類のインスタンスをシリアル化するタイプに依存しないシリアライザを作成しようとしています。 このため、私はProtoBuf.Meta.RuntimeTypeModelを使用しています。これは、ジェネリックシリアライザに提供されるオブジェクトのタイプを動的に追加しています。 タイプを追加するとき、私は再帰反射を利用して、完全な型階層を追加します。私はmyTypeModel.Add(タイプ、真)とmyBaseTypeMetaType.AddSubType(subTypeIndex、タイプ)を呼び出すことによって、タイプを追加AddSubTypeを呼び出すことによってProtoBuf.Meta.MetaTypeを動的に変更すると、例外がスローされます

をこれはすでに私の場合を除いて正常に動作しますシリアライザを使用して型をシリアル化し、この型にサブタイプを追加しようとしました。次に、InvalidOperationExceptionが発生しました:「シリアライザがSerialization.Test.Address用に生成された後は型を変更できません」

モデルの自動コンパイルプロパティをfalseに設定しようとしましたが、私の問題。

protobuf-netは、デフォルトで、型をシリアル化する必要があるときはいつでも、型のシリアライザを作成します。これが完了すると、ProtoBuf.Meta.MetaTypeは変更できません。 これが正しいですか?

私は間違っていますか?

私の目標を達成する他の方法はありますか?

ありがとうございました。

ルイ

答えて

0

それは本当に事前に種類を知りたい - そうか、それは例えば、デシリアライズすることができることを知っている可能性があります。さらに、同じデータをデシリアライズしたいときは、同じキー/タイプマッピングを確実に生成できるように、インデックスの使用法で重要なことに注意してください。

現在ではうまくいく簡単なオプションの1つは、古いデータと新しいものを含む新しいTypeModelを作成することです。これはあまり便利ではありません。 I はモデルのシリアライザのグローバルリセットをサポートしている可能性がありますが、モデル全体をリリースする必要があります(必然的に)。

第3の最も簡単なオプションはもちろんです:事前にタイプを知っています。結局のところ - あなたが既知の/固定の定義を持っていない場合、後であなたのデータを再現することは不可能かもしれません。

+0

ありがとうございました。私はすでに新しいモデルを作り直すための簡単な解決策を選んだ。私の使用例では、未知の種類が限られていると予想しています。システムが定常状態になったら、もうモデルを再作成する必要はありません。 また、proto-bufを使用して2つのエンティティ間のデータ交換をシリアル化する必要もありません。だから、もし彼らが同じ*発見された*型を共有していて、一貫した方法で型を追加すれば、うまくいくはずです。 – Louis

+0

@ user1167325はい;一貫性のある方法でそれらを追加することができればそれはうまくいくはずです –

関連する問題