Object序列化 (3)

将对象序列化可以方便网络进行对象的传输,然后在另一个程序中将序列化的对象反序列化。

通常在以下情况使用序列化可以提高效率:

1.      将一个组件存入文件,当需要时载入;

2.      如果想将软件生命周期才存在的对保存,需要进行序列化;

3.      需要将对象进行网络传输时;

4.      保存对象后要按照对象原来的形式重建对象。

对象的序列化有两种形式:一种是xml形式,还有一种是二进制形式。

序列化为xml形式示例:

using System;

using System.Text;

using System.IO;

using System.Xml.Serialization;

 

namespace Hello

{

   public class Customer

   {

      public int customerID;

      public string customerName;

      public DateTime signUpDate;

      private decimal currentCredit;

      public void SetCurrentCredit(decimal c)

      {

        currentCredit = c;

      }

      public decimal GetCurrentCredit()

      {

        return currentCredit;

      }

   }

   class Program

   {

      static void Main(string[] args)

      {

        Customer customer = new Customer();

        customer.customerID = 12;

        customer.customerName = "Ward Littler";

        customer.signUpDate = DateTime.Now;

        customer.SetCurrentCredit(76.23M);

       

        Console.WriteLine("Now, serializing...");

        StreamWriter sw = new StreamWriter("Customer.xml");

        XmlSerializer serializer = new XmlSerializer(typeof(Customer));

        serializer.Serialize(sw, customer);

        sw.Close();

 

        Console.WriteLine("Now, deserializing...");

        Stream streamOut = new FileStream("Customer.xml", FileMode.Open, FileAccess.Read);

        XmlSerializer deserializer = new XmlSerializer(typeof(Customer));

        Customer desCustomer = (Customer)deserializer.Deserialize(streamOut);

        streamOut.Close();

 

        //Show deserializing result

        Console.WriteLine("CustomerID = {0}", desCustomer.customerID);

        Console.WriteLine("CustomerName = {0}", desCustomer.customerName);

        Console.WriteLine("SignUpDate = {0}", desCustomer.signUpDate);

        Console.WriteLine("CurrentCredit = {0}", desCustomer.GetCurrentCredit());

      }

   }

}

代码运行结果:

生成的xml文件:

xml file

从以上的结果我们可以看到,这种xml形式的序列化智能保存值型的字段信息,而且私有属性不被保存,所以一般用来传输对象中的值。

对象序列化为二进制形式:

BinaryFormatter

using System;

using System.Text;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

//using System.Xml.Serialization;

 

namespace Hello

{

   [Serializable]

   public class Customer

   {

      public int customerID;

      public string customerName;

      public DateTime signUpDate;

      private decimal currentCredit;

      public void SetCurrentCredit(decimal c)

      {

        currentCredit = c;

      }

      public decimal GetCurrentCredit()

      {

        return currentCredit;

      }

   }

   class Program

   {

      static void Main(string[] args)

      {

        Customer customer = new Customer();

        customer.customerID = 12;

        customer.customerName = "Ward Littler";

        customer.signUpDate = DateTime.Now;

        customer.SetCurrentCredit(76.23M);

       

        Console.WriteLine("Now, serializing...");

        Stream streamIn = new FileStream("Customer.bin", FileMode.Create, FileAccess.Write);

        //XmlSerializer serializer = new XmlSerializer(typeof(Customer));

        BinaryFormatter serializer = new BinaryFormatter();

        serializer.Serialize(streamIn, customer);

        streamIn.Close();

 

        Console.WriteLine("Now, deserializing...");

        Stream streamOut = new FileStream("Customer.bin", FileMode.Open, FileAccess.Read);

        //XmlSerializer deserializer = new XmlSerializer(typeof(Customer));

        BinaryFormatter deserializer = new BinaryFormatter();

        Customer desCustomer = (Customer)deserializer.Deserialize(streamOut);

        streamOut.Close();

 

        //Show deserializing result

        Console.WriteLine("CustomerID = {0}", desCustomer.customerID);

        Console.WriteLine("CustomerName = {0}", desCustomer.customerName);

        Console.WriteLine("SignUpDate = {0}", desCustomer.signUpDate);

        Console.WriteLine("CurrentCredit = {0}", desCustomer.GetCurrentCredit());

      }

   }

}

当我们需要进行SOAP形式的序列化时,首先需要添加引用System.Runtime.Serialization.Formatters.Soap。然后使用这个名字空间方可使用SoapFormatter

using System;

using System.Text;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Soap;

//using System.Runtime.Serialization.Formatters.Binary;

//using System.Xml.Serialization;

 

namespace Hello

{

   [Serializable]

   public class Customer

   {

      public int customerID;

      public string customerName;

      public DateTime signUpDate;

      private decimal currentCredit;

      public void SetCurrentCredit(decimal c)

      {

        currentCredit = c;

      }

      public decimal GetCurrentCredit()

      {

        return currentCredit;

      }

   }

   class Program

   {

      static void Main(string[] args)

      {

        Customer customer = new Customer();

        customer.customerID = 12;

        customer.customerName = "Ward Littler";

        customer.signUpDate = DateTime.Now;

        customer.SetCurrentCredit(76.23M);

       

        Console.WriteLine("Now, serializing...");

        Stream streamIn = new FileStream("SoapCustomer.xml", FileMode.Create, FileAccess.Write);

        //XmlSerializer serializer = new XmlSerializer(typeof(Customer));

        //BinaryFormatter serializer = new BinaryFormatter();

        SoapFormatter serializer = new SoapFormatter();

        serializer.Serialize(streamIn, customer);

        streamIn.Close();

 

        Console.WriteLine("Now, deserializing...");

        Stream streamOut = new FileStream("SoapCustomer.xml", FileMode.Open, FileAccess.Read);

        //XmlSerializer deserializer = new XmlSerializer(typeof(Customer));

        //BinaryFormatter deserializer = new BinaryFormatter();

        SoapFormatter deserializer = new SoapFormatter();

        Customer desCustomer = (Customer)deserializer.Deserialize(streamOut);

        streamOut.Close();

 

        //Show deserializing result

        Console.WriteLine("CustomerID = {0}", desCustomer.customerID);

        Console.WriteLine("CustomerName = {0}", desCustomer.customerName);

        Console.WriteLine("SignUpDate = {0}", desCustomer.signUpDate);

        Console.WriteLine("CurrentCredit = {0}", desCustomer.GetCurrentCredit());

      }

   }

}

生成xml结果:

xml result

posted @ 2011-10-03 14:16  Erebus_NET  阅读(453)  评论(0编辑  收藏  举报