List
, serializeIn C# programs we often need to read and write data from the disk. A List
can be serialized—here we serialize (to a file) a List
of objects.
The next time the program runs, we get this List
straight from the disk. We see an example of BinaryFormatter
and its Serialize methods.
We see a "Lizard" class
in C# code. This is the class
we are going to serialize. The program includes the relevant namespaces at the top.
class
called Lizard, and it has 3 properties. These properties are publicly accessible.string
, an int
and a bool
.class
definition.List
of classes to a file, and "r" to read in that same List
.List
of Lizard objects is created. Five different Lizard objects are instantiated.using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable()] public class Lizard { public string Type { get; set; } public int Number { get; set; } public bool Healthy { get; set; } public Lizard(string t, int n, bool h) { Type = t; Number = n; Healthy = h; } } class Program { static void Main() { while(true) { Console.WriteLine("s=serialize, r=read:"); switch (Console.ReadLine()) { case "s": var lizards1 = new List<Lizard>(); lizards1.Add(new Lizard("Thorny devil", 1, true)); lizards1.Add(new Lizard("Casquehead lizard", 0, false)); lizards1.Add(new Lizard("Green iguana", 4, true)); lizards1.Add(new Lizard("Blotched blue-tongue lizard", 0, false)); lizards1.Add(new Lizard("Gila monster", 1, false)); try { using (Stream stream = File.Open("data.bin", FileMode.Create)) { BinaryFormatter bin = new BinaryFormatter(); bin.Serialize(stream, lizards1); } } catch (IOException) { } break; case "r": try { using (Stream stream = File.Open("data.bin", FileMode.Open)) { BinaryFormatter bin = new BinaryFormatter(); var lizards2 = (List<Lizard>)bin.Deserialize(stream); foreach (Lizard lizard in lizards2) { Console.WriteLine("{0}, {1}, {2}", lizard.Type, lizard.Number, lizard.Healthy); } } } catch (IOException) { } break; } } } }s=serialize, r=read: s s=serialize, r=read: r Thorny devil, 1, True Casquehead lizard, 0, False Green iguana, 4, True Blotched blue-tongue lizard, 0, False Gila monster, 1, False s=serialize, r=read:
We call the Serialize method on the BinaryFormatter
instance. This Serialize method receives the stream you want to write to, and also the object itself.
try-catch
block. This is important because file IO frequently throws.Stream
is wrapped in a using block. The File.Open
call attempts to open the new file for writing.To deserialize, the code uses a Stream
wrapped in a using
-block. A new BinaryFormatter
object is created, and it is used to get a new List
.
Stream
as a parameter, is slow but also powerful.List
of Lizards it has read in from the file to the screen in a foreach
-loop.We took a List
generic instance with five objects in it, and serialized it efficiently. And we employed the "using" statement for optimal clarity.