2012-03-10 58 views
2

我需要序列化100000對象的大型數組到文件,但在反序列化期間,我想每讀取1000個對象的卡盤。節儉/原始如何?

目前我沒有找到任何節儉或協議緩衝區的C#任何很好的例子。請有人幫助我。

問候

回答

2

井的protobuf-CSHARP端口有MessageStreamIteratorMessageStreamWriter,讓你可以寫出一個序列,然後遍歷他們爲你反序列化。然後你可以使用LINQ to Objects獲得1000或任何你想要的。

1

如果你使用protobuf-net,有一個方法DeserializeItems(或類似的),它提供了一個IEnumerable<T>的實現,非緩衝,允許你消費物品,只要你喜歡(適用於LINQ「Take」等)。如果原始序列化對象是對象的列表/數組,那麼這將非常有效。它也與DeserializeWithLengthPrefix方法,它從流讀取單個對象,而無需過度讀取(如日誌,因爲它是長度爲前綴,這是這種情況如果項目的數組/列表是串行化的)完全兼容,從而允許你可以在「while」循環中做同樣的事情。讓我知道你是否想要更完整的例子。

例子:

// write 
YourType[] array = ...; 
Serializer.Serialize(destination, array); 

// read 
List<YourType> batch = new List<YourType>(1000); 
foreach(var item in Serializer.DeserializeItems<YourType>(source)) { 
    batch.Add(item); 
    if(batch.Count == 1000) { 
     ProcessBatch(batch); 
     batch.Clear(); 
    } 
} 
if(batch.Count != 0) ProcessBatch(batch); 

還要注意,協議緩衝區是追加的,所以更多的數據添加到您剛纔尋求到文件的結束和開始寫更多的數據文件。

+0

我們的兩個解決方案是否相互兼容,出於興趣? – 2012-03-10 17:16:08

+0

感謝您的快速響應,如果您能提供完整的示例,這將非常棒。 – tabreaz 2012-03-10 17:19:36

+0

@Jon mine是,每個項目:一個**可選**標籤varint,通常爲「1」,那麼長度爲varint,然後是有效載荷。這是兼容的嗎? – 2012-03-10 17:29:25