2010-09-09 62 views
1

我嘗試在WCF/Silverlight應用程序中使用protobuf-net來提高大對象數組的序列化性能。我可以在服務代碼中序列化/反序列化類(添加Order =等)。如何在Silverlight WCF生成的服務中使用protobuf-net

但是,當我嘗試應用ProtoBehavior並從Silverlight調用啓用protobuf的服務方法時,我得到空值而不是數據(或錯誤)。

我想這是因爲:

  1. ProtoBehavior是失去了在Silverlight中生成的服務代碼;
  2. 域類(類型)不在重用的程序集中,它們在客戶端重新生成,並且Order =丟失。

但是目前我無法改變這兩點。有沒有一種方法可以使用protobuf-net而不重構(相當大)的項目,以便與域類共享ASP.NET/Silverlight組件?

我甚至認爲如果沒有其他解決方案來調整Reference.cs以添加缺少的行爲和Order =到適當的成員(通過perl/regex腳本)會更容易,但是我需要調整什麼,以及它會起作用嗎?

回答

1

Re [ProtoBehavior],Silverlight很簡單,缺少我們可以用來默認的擴展點向WCF注入一個替代的序列化器,這是一個痛苦。用silverlight做這個目前的唯一方法是通過導線拋出byte[]Stream,並處理兩端的序列化/反序列化。

Re Order=...,這將是值得檢查的內容;如果他們想出不同的號碼,有辦法通過partial class來解決這個問題 - 一個醜陋的黑客,但是IIRC有ProtoPartialMember(或類似的),可以應用於,但是會談到一個單獨的成員屬性/字段)。您可以通過這種方式更正號碼。在[ProtoContract]上也有Offset(IIRC,對不起 - 無需代碼)幫助如果您有大量字段。

在第2版(未發佈)中,您可以更好地控制排序(/字段編號),而不必混淆屬性。

+0

對,由於某種原因生成Order =僅在生成的reference.cs類中的第一個屬性上丟失,所有其他人都擁有它,但是偏移量爲-1。很奇怪。但現在通過解決這個問題並通過線路發送字節[],我可以恢復我的數據。所以,在Silverlight中沒有辦法使用ProtoBehavior,必須堅持byte []?沒什麼大不了的,但仍然...因爲類型產生了,這將需要額外的努力來強制類生成,等等。 – queen3 2010-09-09 10:06:31

+0

@ queen3 - 不是我所知道的。不過,我確實知道有人(不是我)在C#的RPC上做了很多工作;也許這將在Silverlight中作爲WCF的替代*工作?我還沒有時間玩它呢。 – 2010-09-09 11:33:01