Qu'est-ce que le sérialiseur? Avec BinaryFormatter
, ce serait très, très difficile.
Avec xml, vous pourriez peut-être pré-traiter le XML, mais c'est très compliqué.
D'autres sérialiseurs existent cependant - par exemple, avec protobuf-net il y a peu de différence entre un tableau/liste d'éléments, et une séquence d'éléments individuels - donc il serait assez facile de choisir une séquence finie d'éléments sans traiter le tableau entier.
Exemple complet protobuf-net:
[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
}
}
Notez que DeserializeItems<T>
est une API paresseux/lecture en transit, il ne consomme que les données du flux que vous itérer dessus - d'où le LINQ Take(100)
nous évite lire tout le flux.
Donc, je dois enregistrer le tableau en morceaux et accepter qu'il charge un peu plus? – Rauhotz