Was ist der Serializer?
Mit BinaryFormatter
wäre das sehr, sehr knifflig.
Mit XML könnten Sie vielleicht die XML vorverarbeiten, aber das ist sehr schwierig.
Andere Serialisierer existieren, obwohl - zum Beispiel, mit Protobuf-Net gibt es wenig Unterschied zwischen einem Array/Liste von Elementen und einer Folge von einzelnen Elementen - so wäre es ziemlich einfach, eine endliche Abfolge von Elementen auszuwählen ohne das gesamte Array zu bearbeiten.
komplettes protobuf-net Beispiel:
[ProtoContract]
class Test {
[ProtoMember(1)]
public int Foo { get; set; }
[ProtoMember(2)]
public string Bar { get; set; }
static void Main() {
Test[] data = new Test[1000];
for (int i = 0; i < 1000; i++) {
data[i] = new Test { Foo = i, Bar = ":" + i.ToString() };
}
MemoryStream ms = new MemoryStream();
Serializer.Serialize(ms, data);
Console.WriteLine("Pos after writing: " + ms.Position); // 10760
Console.WriteLine("Length: " + ms.Length); // 10760
ms.Position = 0;
foreach (Test foo in Serializer.DeserializeItems<Test>(ms,
PrefixStyle.Base128, Serializer.ListItemTag).Take(100)) {
Console.WriteLine(foo.Foo + "\t" + foo.Bar);
}
Console.WriteLine("Pos after reading: " + ms.Position); // 902
}
}
Beachten Sie, dass DeserializeItems<T>
ist ein faules/Streaming-API, so dass es verbraucht nur Daten aus dem Stream, wie Sie über sie iterieren - daher die LINQ Take(100)
vermeiden uns den ganzen Strom lesen.
Also muss ich das Array in Chunks speichern und akzeptieren, dass es ein wenig mehr lädt? – Rauhotz