2012-02-14 6 views
1

継承を処理できることが必要なアプリケーション用のシリアライゼーションシステムを構築しようとしています。問題をさらに複雑にするために、アプリケーションは拡張可能であるため、コンパイル時に型が分からない可能性があります。protobuf-net継承とフィールド番号

私はprevious stackoverflow questionを読んでいましたが、これは私の目標に近づくのに役立ちましたが、実際の問題よりも理解の不足が多いです。

だから、これは私が現在持っているのコード...

public interface IBaseFrame 
{ 

} 

public class BasicDataFrame : IBaseFrame 
{ 

} 

public class AnotherFrame : BasicDataFrame 
{ 

} 

です。 。 。 。

RuntimeTypeModel model = TypeModel.Create(); 
MetaType baseType = model.Add(typeof(IBaseFrame), true); 
MetaType basicFrameType = model.Add(typeof(BasicDataFrame),true); 

baseType.AddSubType(7, typeof(BasicDataFrame)); 
model.Add(typeof(AnotherFrame), true); 

basicFrameType.AddSubType(8, typeof(AnotherFrame)); 

今、このコードは(!私の知る限り)正常に動作し、すべてが世界に良い値7,8はfieldNumberのために上記のコードで使用されている場合...私の懸念があります AddSubTypeメソッドの引数。

プラグインが列挙されているので、私はSerialisationManagerとのフレームタイプを登録していると私は(私は任意の多数でそれを起動するので、私はする必要はありませんfieldNumberためのインクリメントカウンタを使用してモデルに追加します将来ベースクラスを拡張することを心配している)。

私はプラグインは、その後、異なる順序で列挙されているか、新しいものが追加されている(または削除)場合自動fieldNumberが、その後の共有で問題が発生します異なるサブタイプごとに異なることになるだろうされて生成されたことを心配していますプラグインが削除されている可能性があるユーザー(異なるプラグイン、したがってサブタイプを持つ可能性があります)または同じシステム上のファイル間のログファイル。

自動的に継承のこの種を扱うのと、将来的に互換性の問題を導入したりせずに任意の狡猾な方法はありますプラグインは、変更したり、私はこれらのfieldNumbersがContantをを維持する保証できる仕組みを考え出す必要がありますときすべてのインストールで?

何か助けや助言をいただければ幸いです。

+1

私は、ウェブサイトにあるバージョン2のベータ版 - r480を使用していることを言いたいはずです。 – Anthony

答えて

2

ここにはマジックはありません。数字は本質的に契約の一部です。以前に保存したデータを逆シリアル化する場合は、確実に再現することが重要です。コンパイル時にデータを知ることができない場合は、多分構成やフィールド番号へのタイプの外部レジストリが役に立ちます。あなたの懸念は正確です。

+1

私はそれほど疑わしい!ああ...プラグインのメカニズムを使ってアプリケーションを拡張することはできますが、プラグインを作成している私たち自身の会社(または「信頼できる」第三者)の誰かになるので、番号を発行するための何らかの処理を実装する必要があります。幸いにも私たちは既に各FrameTypeを装飾し、いくつかのメタデータを提供する属性を持っています。そこにfieldNumberを追加することができます - 私たちは使用できる魔法がないことを確認したかっただけです! 連続していない「大きな」番号を使用すると潜在的な落とし穴がありますか? – Anthony