2011-01-31 67 views
3

我在我們的項目之一中使用protobuf-net來序列化/反序列化大量同類對象。它工作得很好,速度非常棒。只是有一個問題,但。雖然反序列化可以使用linq(或任何其他機制)來指定過濾條件,以便僅加載滿足該條件的對象被加載?反序列化所有對象並應用linq過濾器是相當簡單的,但我想減少加載到內存中的對象的數量。過濾條件可以是相當動態的,所以字符串類型的機制會很棒(類似dlinq?)。使用過濾器反序列化Protobuf-Net對象

回答

2

不,沒有什麼內置的,但如果你有一個明確定義的用例,我當然可以看看(我是作者)。

現在,我會建議使用的一些變種:

var found = Serializer.DeserializeItems<A>(source, PrefixStyle.Base128, 
     Serializer.ListItemTag).FirstOrDefault(obj => obj.Foo = "bar"); 

if(found != null) {...} 

這將在找到匹配,並迅速釋放對象收集(希望能在GEN-0)短路。或爲多個項目,也許是:

var list = Serializer.DeserializeItems<A>(source, PrefixStyle.Base128, 
     Serializer.ListItemTag).Where(obj => obj.Foo = "bar").ToList(); 

(這又及時釋放不匹配的項目)

要在一般情況下做到這一點(特別是對於更復雜的查詢),我想不出沒有實現目標,所以這是可能儘可能接近,除非有一個非常特定(和簡單)的場景,發生與底層數據存儲很好地對齊(例如,過濾器總是在「標籤1」上)。

1

通常情況下,除非是原始數據,否則您將無法將您的序列化數據視爲任何內容,直到完成反序列化。 您可能會從過濾中獲得一些內存好處,但除非這是一個問題,否則不值得打擾。

您可能能夠過濾傳入的序列化表示形式,但要權衡所需的時間和精力,以便實現這一點。

大多數情況下(在桌面或服務器環境中)最好使用可用的簡單選項,然後再使用需要

+0

(在這種情況下,嚴格來說不是「文本」,但我同意你的總體要點) – 2011-01-31 11:31:40

+0

對,編輯:-) – 2011-01-31 11:33:40