Csharp/CSharp Tutorial/File Directory Stream/Binary Serialization

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Binary Custom Serialization

<source lang="csharp">using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class MyClass : ISerializable {

 public string MyStringValue;
 public int MyIntValue;
 public MyClass(string s, int i){ 
     MyStringValue = s; 
     MyIntValue = i;
   }
 public void GetObjectData(SerializationInfo si, StreamingContext ctx)
 {
   Console.WriteLine("[GetObjectData] Context State: {0}", ctx.State.ToString());
   si.AddValue("MyStringValue", MyStringValue.ToUpper());
   si.AddValue("MyIntValue", MyIntValue);
 }
 private MyClass(SerializationInfo si, StreamingContext ctx)
 {
   Console.WriteLine("[ctor] Context State: {0}",ctx.State.ToString());
   MyStringValue = si.GetString("MyStringValue");
   MyIntValue = si.GetInt32("MyIntValue");
 }

} public class MainClass {

 public static int Main(string[] args)
 {
   MyClass myAuto = new MyClass("Sid", 50);
   Stream myStream = File.Create("MyData.dat");
   
   BinaryFormatter myBinaryFormat = new BinaryFormatter();
   myBinaryFormat.Serialize(myStream, myAuto);
   myStream.Close();
   myStream = File.OpenRead("MyData.dat");
   MyClass carFromDisk = (MyClass)myBinaryFormat.Deserialize(myStream);
   Console.WriteLine("{0} is alive!\n", carFromDisk.MyStringValue);
   myStream.Close();
   return 0;
 }

}</source>

[GetObjectData] Context State: All
[ctor] Context State: All
SID is alive!

Customized Serialization

<source lang="csharp">using System; using System.IO; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Employee : ISerializable {

   public string name;
   public int age;
   public string address;
   public Employee(string name, int age, string address)
   {
       this.name = name;
       this.age = age;
       this.address = address;
   }
   private Employee(SerializationInfo info, StreamingContext context)
   {
       name = info.GetString("Name");
       age = info.GetInt32("Age");
       address = info.GetString("Address");
   }
   public void GetObjectData(SerializationInfo inf, StreamingContext con)
   {
       // Always serialize the Employee"s name and age.
       inf.AddValue("Name", name);
       inf.AddValue("Age", age);
       inf.AddValue("Address", address);
   }
   public override string ToString()
   {
       StringBuilder str = new StringBuilder();
       str.AppendFormat("Name: {0}\r\n", name);
       str.AppendFormat("Age: {0}\r\n", age);
       str.AppendFormat("Address: {0}\r\n", address);
       return str.ToString();
   }

} public class MainClass {

   public static void Main(string[] args)
   {
       Employee anEmployee = new Employee("Employee", 6, "London");
       Stream str = File.Create("anEmployee.bin");
       BinaryFormatter bf = new BinaryFormatter();
       bf.Context = new StreamingContext(StreamingContextStates.CrossAppDomain);
       bf.Serialize(str, anEmployee);
       str.Close();
       str = File.OpenRead("anEmployee.bin");
       bf = new BinaryFormatter();
       anEmployee = (Employee)bf.Deserialize(str);
       str.Close();
       Console.WriteLine(anEmployee);
   }

}</source>

Name: Employee
Age: 6
Address: London

Implementing System.Runtime.Serialization.ISerializable

<source lang="csharp">using System; using System.Runtime.Serialization; [Serializable] class EncryptableDocument :ISerializable {

 public EncryptableDocument(){ }
 enum Field
 {
     Title,
     Data
 }
 public string Title;
 public string Data;
 public static string Encrypt(string data)
 {
     string encryptedData = data;
     return encryptedData;
 }
 public static string Decrypt(string encryptedData)
 {
     string data = encryptedData;
     return data;
 }
 public void GetObjectData(SerializationInfo info, StreamingContext context)
 {
     info.AddValue(Field.Title.ToString(), Title);
     info.AddValue(Field.Data.ToString(), Encrypt(Data));
 }
 public EncryptableDocument(SerializationInfo info, StreamingContext context)
 {
     Title = info.GetString(Field.Title.ToString());
     Data = Decrypt(info.GetString(Field.Data.ToString()));
 }

}</source>

Serialization of an object list in binary form

<source lang="csharp">using System; using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; [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;
   [NonSerialized]
   int cacheValue;

} [Serializable] public class MyElementList {

   public void Add(MyElement my)
   {
       row.Add(my);
   }
   
   public override string ToString()
   {
       string temp = null;
       foreach (MyElement my in row)
           temp += my.ToString() + "\n"; 
       return(temp);
   }
   
   ArrayList row = new ArrayList();    

} class MainClass {

   public static void Main()
   {
       MyElementList row = new MyElementList();
       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("MyElementList.bin");
       BinaryFormatter binaryWrite = new BinaryFormatter();
       binaryWrite.Serialize(streamWrite, row);
       streamWrite.Close();
       
       Stream streamRead = File.OpenRead("MyElementList.bin");
       BinaryFormatter binaryRead = new BinaryFormatter();
       MyElementList rowBinary = (MyElementList) binaryRead.Deserialize(streamRead);
       streamRead.Close();
       
       Console.WriteLine("Values after binary serialization");
       Console.WriteLine("{0}", rowBinary);
       
   }

}</source>

Initial value
Gumby: 15
Pokey: 15
Values after binary serialization
Gumby: 0
Pokey: 0

Serialize object to binary form

<source lang="csharp">using System; using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; [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;
   [NonSerialized]
   int cacheValue;

} class MainClass {

   public static void Main()
   {
       MyElement ele = new MyElement("name");
       Console.WriteLine("Initial value");
       Console.WriteLine("{0}", ele);
       
       // write to binary, read it back
       Stream streamWrite = File.Create("MyElement.bin");
       BinaryFormatter binaryWrite = new BinaryFormatter();
       binaryWrite.Serialize(streamWrite, ele);
       streamWrite.Close();
       
       Stream streamRead = File.OpenRead("MyElement.bin");
       BinaryFormatter binaryRead = new BinaryFormatter();
       MyElement element = (MyElement) binaryRead.Deserialize(streamRead);
       streamRead.Close();
       
       Console.WriteLine("Values after binary serialization");
       Console.WriteLine("{0}", element);
       
   }

}</source>

Initial value
name: 15
Values after binary serialization
name: 0

Specify NonSerialized fields

<source lang="csharp">using System; using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; [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;
   [NonSerialized]
   int cacheValue;

} class MainClass {

   public static void Main()
   {
       MyElement ele = new MyElement("name");
       Console.WriteLine("Initial value");
       Console.WriteLine("{0}", ele);
       
       // write to binary, read it back
       Stream streamWrite = File.Create("MyElement.bin");
       BinaryFormatter binaryWrite = new BinaryFormatter();
       binaryWrite.Serialize(streamWrite, ele);
       streamWrite.Close();
       
       Stream streamRead = File.OpenRead("MyElement.bin");
       BinaryFormatter binaryRead = new BinaryFormatter();
       MyElement element = (MyElement) binaryRead.Deserialize(streamRead);
       streamRead.Close();
       
       Console.WriteLine("Values after binary serialization");
       Console.WriteLine("{0}", element);
       
   }

}</source>

Initial value
name: 15
Values after binary serialization
name: 0