using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Soap; class SoapTest { public static void Main() { SerialEmployee emp1 = new SerialEmployee(); SerialEmployee emp2 = new SerialEmployee(); emp1.EmployeeID = 1; emp1.LastName = "B"; emp1.FirstName = "K"; emp1.YearsService = 12; emp1.Salary = 35000.50; emp2.EmployeeID = 2; emp2.LastName = "B"; emp2.FirstName = "J"; emp2.YearsService = 9; emp2.Salary = 23700.30; Stream str = new FileStream("soaptest.xml", FileMode.Create, FileAccess.ReadWrite); IFormatter formatter = new SoapFormatter(); formatter.Serialize(str, emp1); formatter.Serialize(str, emp2); str.Close(); } } [Serializable] public class SerialEmployee { public int EmployeeID; public string LastName; public string FirstName; public int YearsService; public double Salary; public SerialEmployee() { EmployeeID = 0; LastName = null; FirstName = null; YearsService = 0; Salary = 0.0; } }
File Stream
C# Serialization
/* A Programmer's Introduction to C# (Second Edition) by Eric Gunnerson Publisher: Apress L.P. ISBN: 1-893115-62-3 */ // 32 - .NET Frameworks OverviewSerialization // copyright 2000 Eric Gunnerson // file=serial.cs // compile with: csc serial.cs using System; using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; public class FrameworksOverviewSerialization { public static void Main() { MyRow row = new MyRow(); row.Add(new MyElement("Gumby")); row.Add(new MyElement("Pokey")); Console.WriteLine("Initial value"); Console.WriteLine("{0}", row); // write to binary, read it back Stream streamWrite = File.Create("MyRow.bin"); BinaryFormatter binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, row); streamWrite.Close(); Stream streamRead = File.OpenRead("MyRow.bin"); BinaryFormatter binaryRead = new BinaryFormatter(); MyRow rowBinary = (MyRow) binaryRead.Deserialize(streamRead); streamRead.Close(); Console.WriteLine("Values after binary serialization"); Console.WriteLine("{0}", rowBinary); // write to SOAP (XML), read it back streamWrite = File.Create("MyRow.xml"); SoapFormatter soapWrite = new SoapFormatter(); soapWrite.Serialize(streamWrite, row); streamWrite.Close(); streamRead = File.OpenRead("MyRow.xml"); SoapFormatter soapRead = new SoapFormatter(); MyRow rowSoap = (MyRow) soapRead.Deserialize(streamRead); streamRead.Close(); Console.WriteLine("Values after SOAP serialization"); Console.WriteLine("{0}", rowSoap); } } [Serializable] public class MyElement { public MyElement(string name) { this.name = name; this.cacheValue = 15; } public override string ToString() { return(String.Format("{0}: {1}", name, cacheValue)); } string name; // this field isn't persisted. [NonSerialized] int cacheValue; } [Serializable] public class MyRow { public void Add(MyElement my) { row.Add(my); } public override string ToString() { string temp = null; foreach (MyElement my in row) temp += my.ToString() + " "; return(temp); } ArrayList row = new ArrayList(); }
Serialize hiearchy classes
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; public class RoomApp { public static void Main() { // Make a room and listen to the tunes. Console.WriteLine("Made a My Room..."); MyRoom myAuto = new MyRoom("My", 50, false, true); myAuto.TurnOnRadio(true); myAuto.GoUnderWater(); // Now save this room to a binary stream. FileStream myStream = File.Create("RoomData.dat"); BinaryFormatter myBinaryFormat = new BinaryFormatter(); myBinaryFormat.Serialize(myStream, myAuto); myStream.Close(); Console.WriteLine("Saved room to roomdata.dat."); // Read in the Room from the binary stream. Console.WriteLine("Reading room from binary file."); myStream = File.OpenRead("RoomData.dat"); MyRoom roomFromDisk = (MyRoom)myBinaryFormat.Deserialize(myStream); Console.WriteLine(roomFromDisk.PetName + " is alive!"); roomFromDisk.TurnOnRadio(true); myStream.Close(); } } [Serializable] public class Radio { [NonSerialized] private int objectIDNumber = 9; public Radio(){} public void On(bool state) { if(state == true) Console.WriteLine("Music is on..."); else Console.WriteLine("No tunes..."); } } [Serializable] public class Room { protected string petName; protected int maxInternetSpeed; protected Radio theRadio = new Radio(); public Room(string petName, int maxInternetSpeed) { this.petName = petName; this.maxInternetSpeed = maxInternetSpeed; } public Room() {} public String PetName { get { return petName; } set { petName = value; } } public int MaxInternetSpeed { get { return maxInternetSpeed; } set { maxInternetSpeed = value; } } public void TurnOnRadio(bool state) { theRadio.On(state); } } [Serializable] public class MyRoom : Room { protected bool isFlightWorthy; protected bool isSeaWorthy; public MyRoom(string petName, int maxInternetSpeed, bool canFly, bool canSubmerge) : base(petName, maxInternetSpeed) { this.isFlightWorthy = canFly; this.isSeaWorthy = canSubmerge; } public MyRoom(){} public void Fly() { if(isFlightWorthy) Console.WriteLine("Taking off!"); else Console.WriteLine("Falling off cliff!"); } public void GoUnderWater() { if(isSeaWorthy) Console.WriteLine("Diving...."); else Console.WriteLine("Drowning!!!"); } }
NonSerialized attributes
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; public class RoomApp { public static void Main() { // Make a room and listen to the tunes. Console.WriteLine("Made a My Room..."); MyRoom myAuto = new MyRoom("My", 50, false, true); myAuto.TurnOnRadio(true); myAuto.GoUnderWater(); // Now save this room to a binary stream. FileStream myStream = File.Create("RoomData.dat"); BinaryFormatter myBinaryFormat = new BinaryFormatter(); myBinaryFormat.Serialize(myStream, myAuto); myStream.Close(); Console.WriteLine("Saved room to roomdata.dat."); // Read in the Room from the binary stream. Console.WriteLine("Reading room from binary file."); myStream = File.OpenRead("RoomData.dat"); MyRoom roomFromDisk = (MyRoom)myBinaryFormat.Deserialize(myStream); Console.WriteLine(roomFromDisk.PetName + " is alive!"); roomFromDisk.TurnOnRadio(true); myStream.Close(); } } [Serializable] public class Radio { [NonSerialized] private int objectIDNumber = 9; public Radio(){} public void On(bool state) { if(state == true) Console.WriteLine("Music is on..."); else Console.WriteLine("No tunes..."); } } [Serializable] public class Room { protected string petName; protected int maxInternetSpeed; protected Radio theRadio = new Radio(); public Room(string petName, int maxInternetSpeed) { this.petName = petName; this.maxInternetSpeed = maxInternetSpeed; } public Room() {} public String PetName { get { return petName; } set { petName = value; } } public int MaxInternetSpeed { get { return maxInternetSpeed; } set { maxInternetSpeed = value; } } public void TurnOnRadio(bool state) { theRadio.On(state); } } [Serializable] public class MyRoom : Room { protected bool isFlightWorthy; protected bool isSeaWorthy; public MyRoom(string petName, int maxInternetSpeed, bool canFly, bool canSubmerge) : base(petName, maxInternetSpeed) { this.isFlightWorthy = canFly; this.isSeaWorthy = canSubmerge; } public MyRoom(){} public void Fly() { if(isFlightWorthy) Console.WriteLine("Taking off!"); else Console.WriteLine("Falling off cliff!"); } public void GoUnderWater() { if(isSeaWorthy) Console.WriteLine("Diving...."); else Console.WriteLine("Drowning!!!"); } }
Working with the Serializable Attribute
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] class Point2D { public int X; public int Y; } class MyMainClass { public static void Main() { Point2D My2DPoint = new Point2D(); My2DPoint.X = 100; My2DPoint.Y = 200; Stream WriteStream = File.Create("Point2D.bin"); BinaryFormatter BinaryWrite = new BinaryFormatter(); BinaryWrite.Serialize(WriteStream, My2DPoint); WriteStream.Close(); Point2D ANewPoint = new Point2D(); Console.WriteLine("New Point Before Deserialization: ({0}, {1})", ANewPoint.X, ANewPoint.Y); Stream ReadStream = File.OpenRead("Point2D.bin"); BinaryFormatter BinaryRead = new BinaryFormatter(); ANewPoint = (Point2D)BinaryRead.Deserialize(ReadStream); ReadStream.Close(); Console.WriteLine("New Point After Deserialization: ({0}, {1})", ANewPoint.X, ANewPoint.Y); } }
Use XML Serialization with Custom Objects
using System; using System.Xml; using System.Xml.Serialization; using System.IO; public class SerializeXml { private static void Main() { CarList catalog = new CarList("New List", DateTime.Now.AddYears(1)); Car[] cars = new Car[2]; cars[0] = new Car("Car 1", 12342.99m); cars[1] = new Car("Car 2", 21234123.9m); catalog.Cars = cars; XmlSerializer serializer = new XmlSerializer(typeof(CarList)); FileStream fs = new FileStream("CarList.xml", FileMode.Create); serializer.Serialize(fs, catalog); fs.Close(); catalog = null; // Deserialize the order from the file. fs = new FileStream("CarList.xml", FileMode.Open); catalog = (CarList)serializer.Deserialize(fs); // Serialize the order to the Console window. serializer.Serialize(Console.Out, catalog); } } [XmlRoot("carList")] public class CarList { [XmlElement("catalogName")] public string ListName; // Use the date data type (and ignore the time portion in the serialized XML). [XmlElement(ElementName="expiryDate", DataType="date")] public DateTime ExpiryDate; [XmlArray("cars")] [XmlArrayItem("car")] public Car[] Cars; public CarList() { } public CarList(string catalogName, DateTime expiryDate) { this.ListName = catalogName; this.ExpiryDate = expiryDate; } } public class Car { [XmlElement("carName")] public string CarName; [XmlElement("carPrice")] public decimal CarPrice; [XmlElement("inStock")] public bool InStock; [XmlAttributeAttribute(AttributeName="id", DataType="integer")] public string Id; public Car() { } public Car(string carName, decimal carPrice) { this.CarName = carName; this.CarPrice = carPrice; } }
Three types of Serialization: Binary, Soap, XML
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; using System.Xml.Serialization; using System.Collections; [Serializable] public class Radio { public bool hasTweeters; public bool hasSubWoofers; public double[] stationPresets; [NonSerialized] public string radioID = "001"; } [Serializable] public class Car { public Radio theRadio = new Radio(); public bool isHatchBack; } [Serializable, XmlRoot(Namespace = "http://www.yoursite.com")] public class JamesBondCar : Car { public JamesBondCar(bool SkyWorthy, bool SeaWorthy) { canFly = SkyWorthy; canSubmerge = SeaWorthy; } public JamesBondCar() { } [XmlAttribute] public bool canFly; [XmlAttribute] public bool canSubmerge; } class Program { static void Main(string[] args) { JamesBondCar jbc = new JamesBondCar(); jbc.canFly = true; jbc.canSubmerge = false; jbc.theRadio.stationPresets = new double[] { 89.3, 105.1, 97.1 }; jbc.theRadio.hasTweeters = true; BinaryFormatter binFormat = new BinaryFormatter(); Stream fStream = new FileStream("CarData.dat",FileMode.Create, FileAccess.Write, FileShare.None); binFormat.Serialize(fStream, jbc); fStream.Close(); fStream = File.OpenRead("CarData.dat"); JamesBondCar carFromDisk =(JamesBondCar)binFormat.Deserialize(fStream); Console.WriteLine("Can this car fly? : {0}", carFromDisk.canFly); fStream.Close(); SoapFormatter soapForamt = new SoapFormatter(); fStream = new FileStream("CarData.soap",FileMode.Create, FileAccess.Write, FileShare.None); soapForamt.Serialize(fStream, jbc); fStream.Close(); XmlSerializer xmlForamt = new XmlSerializer(typeof(JamesBondCar),new Type[] { typeof(Radio), typeof(Car) }); fStream = new FileStream("CarData.xml",FileMode.Create, FileAccess.Write, FileShare.None); xmlForamt.Serialize(fStream, jbc); fStream.Close(); ArrayList myCars = new ArrayList(); myCars.Add(new JamesBondCar(true, true)); myCars.Add(new JamesBondCar(true, false)); myCars.Add(new JamesBondCar(false, true)); myCars.Add(new JamesBondCar(false, false)); fStream = new FileStream("CarCollection.xml",FileMode.Create, FileAccess.Write, FileShare.None); xmlForamt = new XmlSerializer(typeof(ArrayList),new Type[] { typeof(JamesBondCar), typeof(Car), typeof(Radio) }); xmlForamt.Serialize(fStream, myCars); fStream.Close(); } }