如何理解C#中的序列化与反序列化
2007-11-13 23:18
260 查看
序列化(Serialization)是.NET平台最酷的特性之一。
1、为什么要序列化:
首先你应该明白系列化的目的就不难理解他了。系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算。比如你的客户端要调用服务器上的一个方法获得一个产品对象,比如方法为:public Product findProduct(int product_id);
注意该方法返回一个Product对象,如果没有系列化技术,客户端就收不到返回的对象Product。而序列化的实现就是把对象变成一个可在网络上传输的字节流。
2、利用序列化技术,可以实现对象的备份和还原。序列化可以将内存中的对象(或对象图)序列化为数据流,并保存到磁盘上进行持久化;还可以将数据流反序列化为对象,实现对象的还原。序列化技术在分布式系统的数据传输中得到充分的利用,如:XML Web Service 利用XML序列化实现跨平台,.NET Remoting 则用到了二进制序列化和SOAP序列化。
.NET Compact Framework 2.0 支持XML序列化,不支持二进制序列化和SOAP序列化。而 .NET Compact Framework 1.0 连XML序列化都不支持。不过 OpenNETCF 1.x 为 .NET CF 1.0 实现了一个XML序列化的类,这个类在 OpenNETCF.Xml.dll 程序集中可以找到。
序列化和反序列化用于将一个对象保存到文件,和从文件读取。
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable()]//可以序列化的类需要用这个属性标记
public class ToBeSerialized
{
public int a;
public string b;
public ToBeSerialized(int a,string b)
{
this.a=a;
this.b=b;
}
}
public class Test
{
public void Serialize()//序列化
{
ToBeSerialized tbs = new ToBeSerialized(22,"SOM");
Stream fs = File.Create("Serialized.txt");
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(fs, tbs);
fs.Close();
}
public void DeSerialize()//反序列化
{
ToBeSerialized restore;
Stream fs = File.OpenRead("Serialized.txt");
BinaryFormatter deserializer = new BinaryFormatter();
restore = (ToBeSerialized)(deserializer.Deserialize(fs));//反序列化得到的对象
fs.Close();
}
}
在 .NET CF 2.0 中使用XML序列化很简单,跟 .NET Framework 中的一样。
以上示例将对象序列化后,写入内存流中。你可以换成文件流(FileStream),这样就可以实现对象的持久化。
1、为什么要序列化:
首先你应该明白系列化的目的就不难理解他了。系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算。比如你的客户端要调用服务器上的一个方法获得一个产品对象,比如方法为:public Product findProduct(int product_id);
注意该方法返回一个Product对象,如果没有系列化技术,客户端就收不到返回的对象Product。而序列化的实现就是把对象变成一个可在网络上传输的字节流。
2、利用序列化技术,可以实现对象的备份和还原。序列化可以将内存中的对象(或对象图)序列化为数据流,并保存到磁盘上进行持久化;还可以将数据流反序列化为对象,实现对象的还原。序列化技术在分布式系统的数据传输中得到充分的利用,如:XML Web Service 利用XML序列化实现跨平台,.NET Remoting 则用到了二进制序列化和SOAP序列化。
.NET Compact Framework 2.0 支持XML序列化,不支持二进制序列化和SOAP序列化。而 .NET Compact Framework 1.0 连XML序列化都不支持。不过 OpenNETCF 1.x 为 .NET CF 1.0 实现了一个XML序列化的类,这个类在 OpenNETCF.Xml.dll 程序集中可以找到。
序列化和反序列化用于将一个对象保存到文件,和从文件读取。
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable()]//可以序列化的类需要用这个属性标记
public class ToBeSerialized
{
public int a;
public string b;
public ToBeSerialized(int a,string b)
{
this.a=a;
this.b=b;
}
}
public class Test
{
public void Serialize()//序列化
{
ToBeSerialized tbs = new ToBeSerialized(22,"SOM");
Stream fs = File.Create("Serialized.txt");
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(fs, tbs);
fs.Close();
}
public void DeSerialize()//反序列化
{
ToBeSerialized restore;
Stream fs = File.OpenRead("Serialized.txt");
BinaryFormatter deserializer = new BinaryFormatter();
restore = (ToBeSerialized)(deserializer.Deserialize(fs));//反序列化得到的对象
fs.Close();
}
}
在 .NET CF 2.0 中使用XML序列化很简单,跟 .NET Framework 中的一样。
// XML序列化 Customer 数组 using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { Customer[] customers = GetCustomers(); //从数据库或远程服务器获取客户 System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(Customer)); ser.Serialize(ms, customers); byte[] buffer = ms.ToArray(); // 获取XML文档的内容 string xml = System.Text.Encoding.ASCII.GetString(buffer , 0, buffer .Length); } // XML反序列化 Customer 数组 using (System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer)) { System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(Customer)); Customer[] customers = ser.Deserialize(ms) as Customer[]; } |
相关文章推荐
- 如何理解C#中的序列化与反序列化【转】
- C#中的"序列化" Serializable 理解
- C# 如何理解委托事件(一)
- 我是如何学习设计模式的一:.NET C# 委托定天下,学好委托事件,设计模式精髓可以理解三分之一,怎么说也是三分天下之势了
- 一个可序列化的C#对象,如何转成一个XML格式的文件或字符串(转)
- 如何理解C# 多态中的override和new
- c# format 格式化如何理解?
- [转]如何在C#里序列化集合对象
- [c#]Webservice中如何实现方法重载(overload)以及如何传送不能序列化的对象作参数
- C#.NET常见问题(FAQ)-命名空间namespace如何理解
- C# 如何将数据序列化到本地 数组 对象 等等
- C#如何把XSD中HexBinary类型序列化uint类型
- [c#]Webservice中如何实现方法重载(overload)以及如何传送不能序列化的对象作参数
- C#编程:如何理解委托-2
- C#中的"序列化" Serializable 理解
- C# 如何理解委托事件(二)
- 【C#】泛型如何理解
- 如何理解c#中的委托?
- C#中的事件驱动机制如何理解!
- C#如何把XSD中HexBinary类型序列化uint类型