2

コンパクトフレームワーク(3.5)で何千ものオブジェクトを逆シリアル化していますが、低速です。デバイスを20秒以上かけて終了します。非コンパクトなもののようにコンパイルして実行するのではなく、リフレクションによって行われることがわかりました。だから私は、最初にタイプモデルdllをプリコンパイルして生成できると思いましたか?

だから私は次のことをしました:

  1. すべてのContractクラスをスマートデバイスdllに抽出します(Protobuf-net CF3.5 Dllを参照します)
  2. 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");
      }
    }
    
  3. デバイスプロジェクトに戻り、コントラクトDLL、生成されたMy.Serialization.dll、およびProtobuf-netCF3.5Dllを参照します。
  4. デフォルトのモデルを使用する代わりに、「new TypeModel()」によって構築されたモデルで逆シリアル化するように変更しました

実際には正しくコンパイルされます。リフレクターで生成されたdllを見ると、予想どおりです。

実行時にMissingMethodExceptionをスローすることを除いて。ただし、コンパクトフレームワークはそれを報告しないため、正確に欠落しているものが欠落しています。

生成されたMy.Serialization.dllが実際には「デスクトップ」dllを参照しているためですが、一部のメソッドがありません。

では、私の質問に戻りますが、コンパクトなフレームワークで使用されるタイプモデルの事前生成をどのように実現できますか?または、何か他のことをすることでパフォーマンスを向上させることができますか?

4

1 に答える 1

2

良いニュースだと思います。私はクロスコンパイルの問題に非常に長い時間を費やしてきました(わかりました、私は主にWP7とWinRTについて質問する人々によって動かされてきました)、まったく新しいクロスプラットフォームプリコンパイラで最高潮に達しました。

これはすでにコードが行うことを実行します。つまり[ProtoContract]、入力アセンブリ/アセンブリ内のすべてのタイプを検索します。正直なところCFでは試していませんが、とても期待しています。私はあなたがどのように乗るかを本当に聞きたいです。CFに対してテストしていない唯一の理由は、VS2008VMを搭載した外付けドライブが死んでしまったことです。

使用法:

precompile {some path}\YourCFDto.dll –o:MySerializer.dll –t:MySerializer

注:現時点では、ソースから「プリコンパイル」をビルドする必要がありますが、これが問題である場合は、公開に取り掛かることができます。

何か問題がありましたら、お知らせください。

于 2012-07-24T21:13:43.757 に答える