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形式的序列化智能保存值型的字段信息,而且私有属性不被保存,所以一般用来传输对象中的值。
对象序列化为二进制形式:
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结果: