W jaki sposób w C# zapisać kolekcję obiektów do pliku binarnego?
W jaki sposób w C# zapisać kolekcję obiektów do pliku binarnego?
W celu zapisania kolekcji obiektów w pliku binarnym najlepiej skorzystać z gotowego mechanizmu serializacji danych.
Serializacja danych polega na zapisie stanu obiektów do strumienia danych, na przykład w postaci pliku binarnego lub tekstowego.
Procesem odwrotnym jest deserializacja, czyli odtworzenie obiektów na podstawie strumienia danych.
Przykład:
Otwieramy strumień do zapisu, w naszym przypadku plik. Tworzymy instancję BinaryFormatter i serializujemy dane. Po zakończonej operacji zamykamy strumień.
// open a stream for writing. // In this case, use a file stream. FileStream fs = new FileStream("DataFile.dat", FileMode.Create); // Construct a BinaryFormatter and use it to serialize the data to the stream. BinaryFormatter formatter = new BinaryFormatter(); try { formatter.Serialize(fs, addresses); } catch (SerializationException e) { Console.WriteLine("Failed to serialize. Reason: " + e.Message); throw; } finally { fs.Close(); }
Następnie tak zapisany plik możemy wczytać i odtworzyć listę obiektów za pomocą deserializacji:
// Open the file containing the data that you want to deserialize. FileStream fs = new FileStream("DataFile.dat", FileMode.Open); try { BinaryFormatter formatter = new BinaryFormatter(); // Deserialize the hashtable from the file and // assign the reference to the local variable. addresses = (Hashtable) formatter.Deserialize(fs); } catch (SerializationException e) { Console.WriteLine("Failed to deserialize. Reason: " + e.Message); throw; } finally { fs.Close(); }
W przypadku, gdy nie wystarcza nam standardowy zapis i potrzebujemy większej kontroli nad zapisem, powinniśmy zaimplementować metodę GetObjectData z interfejsu ISerializable (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.getobjectdata(v=vs.100).aspx).
Oprócz serializacji pliku binarnego istnieje możliwość serializacji do pliku tekstowego w formacie XML lub JSON, które przydatne są zwłaszcza przy wymianie danych.