2

プリコンパイルされた protobuf-net シリアライザー アセンブリを WCF およびクライアント (コードでシリアル化/逆シリアル化するのではなく) で使用して、DTO 型の最初の使用を高速化する方法について、誰でも光を当てることができますか?

protobuf-net と datacontractserializer を使用することで、大規模な WCF/WPF アプリケーションで多くのパフォーマンスを向上させることができました。ただし、DTO からシリアライゼーション アセンブリをプリコンパイルできても、WCF または WPF クライアントで使用することはできません。Web サービス プロセスは、新しい DTO を含むそのプロセスからの最初の呼び出しに常に長い時間がかかります。おそらく、オンザフライでシリアライゼーション アセンブリを生成するためです。生成したアセンブリを使用するように WCF サーバーや WPF クライアントに指示するにはどうすればよいですか?

関連する問題として、一部の DTO に SolidColorBrush 型のプロパティがあり、これによりプリコンパイラが「型のシリアライザーが定義されていません: System.Windows.Media.SolidColorBrush」でフォールオーバーします。このサポートを protobuf-net モデルに追加するコードがいくつかありますが、残りの DTO が ProtoContractAttribute などの属性で装飾されている場合、それを (プリコンパイラまたはコードに) 適用する方法がわかりません。

どんな助けでも大歓迎です

4

1 に答える 1

2

現時点では、WCF でプリコンパイル済みモデルを使用する唯一の方法は、コードを使用して手動で WCF を構成することです。特に、ProtoOperationBehavior手動でモデルを追加して、モデルを指定します。

var behavior = new ProtoOperationBehavior();
behavior.Model = new MyPrecompiledSerializer();

私はそれを行う完全なエンドツーエンドの WCF の例を持っていないことを告白します。新しいリリースでは、構成を介してカスタムシリアライザータイプを微調整ProtoBehaviorExtensionおよび/またはProtoBehaviorAttribute指定できるようにする方が簡単かもしれないと思いますが、そのコードは今日存在しません。

当面の間、問題が最初の操作でのわずかな遅延である場合は、明示的に必要ないくつかの型をデフォルト モデルに追加してコンパイルすることもできます。

RuntimeTypeModel.Default.Add(typeof(Foo), true);
RuntimeTypeModel.Default.Add(typeof(Bar), true);
RuntimeTypeModel.Default.CompileInPlace();

とは言っても、コンパイルはそれほど遅くはありません -モデルが本当に複雑 (数百の型)でない限り、コンパイルが顕著な遅延を引き起こしている場合は少し驚かれることでしょう。遅延が WCF、ネットワーク、TCP などのオーバーヘッドだけである可能性はありますか?


に関してSolidBrush、そして暗黙のうちに: -実行時Colorにそれらを設定することが可能です:

RuntimeTypeModel.Default.Add(typeof(System.Windows.Media.Color), false)
    .Add("R", "G", "B", "A");
RuntimeTypeModel.Default.Add(typeof(System.Windows.Media.SolidColorBrush), false)
    .Add("Color");

ただし、「プリコンパイル」を使用するときにこれを行うためのメカニズムをまだ追加していません。技術レベルでははるかにトリッキーです。(たとえば) 属性に対して実行可能メソッドを使用することはできません。 precompile" は、任意の CLI (Silverlight、WinRT、.NET 1.1、CF など) 用であり、非常に異なるメカニズムによってロードされます。

私の好みのアプローチは次のとおりです。それを次のように公開しないでください- (最終的な実装ではなく)データSystem.Windows.Media.Colorを表す独自のDTOクラスを作成し、それらの間をマップします。または、モデルを構成してからorを呼び出すことにより、「プリコンパイル」のように機能する独自のユーティリティ コンソール exe を作成することもできます。RuntimeTypeModel.Default.Compile(string,string)RuntimeTypeModel.Default.Compile(CompilerOptions)

于 2012-11-14T07:32:30.847 に答える