簡體   English   中英

WCF 推薦用於序列化多個對象的方法

[英]WCF Recommend approaches for serializing multiple objects

我正在嘗試圍繞可能的瓶頸進行優化。

我有一個服務器應用程序,它從數據庫向遠程應用程序提供對象,它可以處理 1 - n 個不同類型的 1 - n 個對象(其中 n 可以是一個相對較高的數字),這些對象都實現了一個通用接口,但可能包含許多不同類型的獨特屬性。

客戶端應用程序將服務器對象存儲在本地緩存中,直到它們准備好通過服務器將它們持久化回數據庫。

這是目前在 WCF 中完成的,每個類都定義了一個 DataContract。

由於可能需要傳遞回服務器的可能大量對象(它會根據實現而變化),我不想再將所有這些都作為單獨的調用來執行,而是將所有對象包裝在一個序列化(或更好的壓縮)流並將它們作為一個連接發送到服務器。

我可以很簡單地推出我自己的方法,但更願意使用推薦的方法,並希望有人可以提出建議。 如果你能說服我,我也願意接受我的方法可能不是最好的主意。

“相對高”到底有多高?

例如,發生的一種選擇是使用包裝器對象:

[DataContract]
public class Wrapper {
    [DataMember(Order = 1)]
    public List<Foo> Foos {get {...}}

    [DataMember(Order = 2)]
    public List<Bar> Bars {get {...}}

    [DataMember(Order = 3)]
    public List<Blop> Blops {get {...}}
}

然后您應該能夠發送包含任意數量FooBar和/或Blop記錄的單個消息。 我故意包含Order屬性 - 如果你想減少流的大小,你可以考慮protobuf-net - 有了上面的布局,protobuf-net 可以簡單地通過在方法上包含[ProtoBehavior]來掛鈎到 WCF(在您想要攻擊的操作合同接口(在客戶端和服務器上)。 這會將傳輸切換為使用 google 的“協議緩沖區”二進制格式,使用 base-64 進行編碼。 如果您使用的是 basic-http 綁定,則如果啟用,這也可以使用 MTOM,因此即使是 base-64 也不是問題。 使用它,您可以獲得顯着的數據傳輸節省(根據顯示的數字,大約是空間的 1/5)。

(編輯 1 - protobuf-net 假設FooBarBlop使用Order屬性)

(編輯 2 - 請注意,您始終可以將請求分解為許多中等大小的Wrapper消息,然后在服務器上(大概在數據庫中的臨時表中)獲得所有更改后調用方法來應用所有更改)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM