protobuf-netは戦略パターンを使用します。 (型ごとに1回だけ)必要に応じて型を調べるためにリフレクションを使用し、シリアライザのセットを構築します(共通のインターフェイスに基づいています)。使用時に既知のシリアライザのセット
の中には、それがメンバーと話すときに反射の合理的な使用を試みます。プロパティと対話するにはDelegate.CreateDelegate
、フィールドに対話するにはDynamicMethod
(およびカスタムIL)を使用します(可能な場合は、ターゲットフレームワークによって異なります)。これは、ちょうどDynamicInvoke
(これは非常に遅い)ではなく、と知られているデリゲートタイプと常に話していることを意味します。固定サイズを使用して、(入力/出力ストリームの)
をループし、私はジェネリックポイントでミスをしたと思います。その複雑さは、ジェネリックをシステムbent it out of shape in a few placesに強制し、(複雑なモデルの場合)いくつかの重大な問題を積極的に引き起こすことを意味しました。on compact framework。
は、私は(唯一の私の頭の中で)非 -genericインターフェースを使用して、これをリファクタリングすると、代わりに(適したフレームワークのための)ILGenerator
をさらに活用するために、いくつかのデザインを持っている(私の最初の選択肢はExpression
をされて、それだろう力より高いフレームワークバージョン)。しかし問題は、これが働くにはかなりの時間がかかることであり、ごく最近まではI've been pretty swampedです。
最近私はstart spending some time on protobuf-net againに管理していますので、うまくいけばリクエストのバックログなどをクリアしてすぐに開始してください。反射(すなわち、ワイヤマッピングを別々に記述する)よりもモデルotherで動作させることも私の意図です。
、私はまた、あなたが生成されたコードを使用する場合は2(オプション)codegenをルートがあることを明確にすべき任意の生成されたコード
を生成しません。 protogen.exeまたはVS add-inは、.protoファイルからのコード生成を許可します。しかし、これはが必要ではありません。 - 既存の.protoファイルがある場合、または契約書の最初の開発のために別の言語(C++など)と相互運用する意向がある場合には、主に便利です。
あなたがソースを読んでみましたか?あるいはMarkに直接お尋ねしますか? – Lazarus
私はいくつかのアイデアを試してみましたが、もし速い答えが得られれば素敵です。 – MichaelT
これは何時間も話しています.-pしかし仕事が終わるまで待つ必要があります... –