Wenn Sie protobuf-net verwenden, gibt es eine Methode DeserializeItems (oder ähnlich), die eine IEnumerable<T>
Implementierung, die nicht gepuffert ist und es Ihnen ermöglicht, Elemente nach Belieben zu konsumieren (geeignet für LINQ "Take" usw.). Dies funktioniert perfekt, wenn das ursprünglich serialisierte Objekt eine Liste/ein Array von Objekten ist. Es ist auch vollständig kompatibel mit der DeserializeWithLengthPrefix-Methode, die ein einzelnes Objekt aus einem Stream liest, ohne zu viel zu lesen (solange es längenpräfixiert ist, was ist der Fall wenn ein Array/eine Liste von Elementen serialisiert wird), so dass Sie dasselbe z. B. in einer "while"-Schleife tun können. Lassen Sie mich wissen, wenn Sie vollständigere Beispiele wünschen.
Beispiel:
// 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);
Beachten Sie auch, dass Protokollpuffer anfügbar sind. Um einer Datei weitere Daten hinzuzufügen, suchen Sie einfach das Ende der Datei und beginnen mit dem Schreiben weiterer Daten.