2012-11-14 47 views
1

任何人都可以闡明我如何使用WCF和客戶端的預編譯protobuf-net串化器程序集(不是序列化/反序列化代碼)以加速第一次使用DTO類型的?使用protobuf-net RuntimeTypeModel和預編譯WPF客戶端的問題

通過使用protobuf-net與datacontractserializer,我已經在我的大型WCF/WPF應用程序中獲得了很多性能改進。但是,即使我可以從我的DTO預編譯序列化程序集,但我無法使WCF或WPF客戶端使用它。 Web服務進程通常需要很長時間來處理來自該進程的涉及新DTO的任何第一次調用,這大概是爲了即時生成序列化程序集。 如何指示WCF服務器和/或WPF客戶端使用我生成的程序集?

在一個相關的問題上,我在某些DTO中有SolidColorBrush類型的屬性,這使得預編譯器在「No serializer defined for type:System.Windows.Media.SolidColorBrush」中翻轉過來。 我有一些代碼將這種支持添加到protobuf-net模型中,但是我不明白如何將它應用到預編譯程序或我的代碼中,而其餘的DTO都用屬性例如。 ProtoContractAttribute。

大加讚賞

回答

2

目前任何幫助,只有這樣,才能使WCF使用預編譯的模式將通過代碼手動配置WCF,特別是手動添加ProtoOperationBehavior,並指定型號:

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

我承認我沒有一個完整的端到端的WCF例子。我懷疑在新版本中,我可能會更容易地調整ProtoBehaviorExtension和/或ProtoBehaviorAttribute以允許您通過配置指定自定義序列化器類型 - 但該代碼目前不存在。

在此期間,如果這個問題是在第一次操作稍有延遲,那麼你也可以添加你需要exlicitly腳趾的默認模型類型的幾個,並編譯:

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"); 

不過,我還沒有使用「預編譯時增加了一個機制來做到這一點「 - 在技術層面上,技術要複雜得多:我不能只在一個屬性上使用可執行的方法,因爲被」預編譯「檢查的程序集可以用於任何CLI(Silverlight,WinRT,.NET 1.1, CF等) - 同樣,它由非常不同的機制加載。

我首選的方法是:不公開爲System.Windows.Media.Color - 寫表示數據(而不是最終的實現)你自己的DTO類,以及它們之間的映射。或者,也可以通過配置模型,然後調用RuntimeTypeModel.Default.Compile(string,string)RuntimeTypeModel.Default.Compile(CompilerOptions)來編寫您自己的實用程序控制臺exe文件,該文件的行爲類似「預編譯」。

+0

Marc,謝謝你的幫助。我正在嘗試測試並實施您提出的建議。我特別喜歡CompileInPlace的想法,是的,我有數百個DTO。當我全力以赴時,我會繼續跟進。 –

+0

Marc,我在r580和預編譯方面取得了很大的成功,但是我剛剛安裝了r602,現在我有一個問題。我使用ImplicitFields.AllFields來讓我的DTO與最小額外代碼一起工作,並且預編譯運行正常,現在我在任何私有聲明中得到「非公共成員不能用於完整的dll編譯」。有任何想法嗎?謝謝 –