コレクションを1つずつ逆シリアル化するには、一度に1つずつオブジェクトをシリアル化する必要があります。
public static class StreamSerializer
{
public static void Serialize<T>(IList<T> list, string filename)
{
using (Stream stream = File.Open(filename, FileMode.Create))
{
BinaryFormatter bin = new BinaryFormatter();
// seralize each object separately
foreach (var item in list)
bin.Serialize(stream, item);
}
}
public static IEnumerable<T> Deserialize<T>(string filename)
{
using (Stream stream = File.Open(filename, FileMode.Open))
{
BinaryFormatter bin = new BinaryFormatter();
// deserialize each object separately, and
// return them one at a time
while (stream.Position < stream.Length)
yield return (T)bin.Deserialize(stream);
}
}
}
その後、あなたは、単に書くことができます:
CarsCollection cars = new CarsCollection
{
new Cars{ Brand = "BMW", Model = "7.20" },
new Cars{ Brand = "Mercedes", Model = "CLK" }
};
// note that you cannot serialize the entire list if
// you want to query without loading - it must be symmetrical
StreamSerializer.Serialize(cars, "data.bin");
// the following expression iterates through objects, processing one
// at a time. "First" method is a good example because it
// breaks early.
var bmw = StreamSerializer
.Deserialize<Cars>("data.bin")
.First(c => c.Brand == "BMW");
あなたCarsCollection
は別のクラスに属している場合は、もう少し複雑なケースがあるかもしれない
最も簡単な方法は、あなた自身のジェネリッククラスを定義することです。その場合、ISerializable
を実装する必要がありますが、原則は似ています。
通常の規則では、複数のエンティティに名前を付けることはありません(Cars
はCar
とする必要があります)。
XMLにシリアル化されていますか? – Groo
@Grooではなく、XMLにシリアル化されていません。私は私の質問にクラスの実装を追加しました。 – onatm
シリアライゼーションは実際にメモリ内のバイナリファイルをロードせず、ストリームを通過して即座にデシリアライズします。しかし、これが行われた後、オブジェクト全体がメモリにロードされます。そのため、オブジェクトの一部だけをロードしたいと思うようになります。それはどの部分ですか?単一のプロパティ?そして、「照会」と言ったら、LINQ照会を参照していますか?その場合、コードからは見えないオブジェクトのコレクションが存在するはずです。 – Groo