コンパクトフレームワーク(3.5)で何千ものオブジェクトを逆シリアル化していますが、低速です。デバイスを20秒以上かけて終了します。非コンパクトなもののようにコンパイルして実行するのではなく、リフレクションによって行われることがわかりました。だから私は、最初にタイプモデルdllをプリコンパイルして生成できると思いましたか?
だから私は次のことをしました:
- すべてのContractクラスをスマートデバイスdllに抽出します(Protobuf-net CF3.5 Dllを参照します)
Protobuf-netの「Desktop」DLLと上記で作成したContractDllを参照して、デスクトップ3.5コンソールアプリケーションを作成します。
class Program { static void Main(string[] args) { var bb = TypeModel.Create(); foreach (var t in Assembly.GetAssembly(typeof(My.ContractX)).GetTypes()) { var contract = t.GetCustomAttributes(typeof (ProtoBuf.ProtoContractAttribute), false); if (contract.Length > 0) { bb.Add(t, true); } } bb.Compile("My.TypeModel", "My.Serialization.dll"); } }
- デバイスプロジェクトに戻り、コントラクトDLL、生成されたMy.Serialization.dll、およびProtobuf-netCF3.5Dllを参照します。
- デフォルトのモデルを使用する代わりに、「new TypeModel()」によって構築されたモデルで逆シリアル化するように変更しました
実際には正しくコンパイルされます。リフレクターで生成されたdllを見ると、予想どおりです。
実行時にMissingMethodExceptionをスローすることを除いて。ただし、コンパクトフレームワークはそれを報告しないため、正確に欠落しているものが欠落しています。
生成されたMy.Serialization.dllが実際には「デスクトップ」dllを参照しているためですが、一部のメソッドがありません。
では、私の質問に戻りますが、コンパクトなフレームワークで使用されるタイプモデルの事前生成をどのように実現できますか?または、何か他のことをすることでパフォーマンスを向上させることができますか?