技术开发 频道

在 .NET Compact Framework 2.0 中使用序列化

   【IT168 技术文档】1. 序列化概述

    序列化(Serialization)是.NET平台最酷的特性之一。利用序列化技术,可以实现对象的备份和还原。序列化可以将内存中的对象(或对象图)序列化为数据流,并保存到磁盘上进行持久化;还可以将数据流反序列化为对象,实现对象的还原。序列化技术在分布式系统的数据传输中得到充分的利用,如: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 程序集中可以找到。

    2. XML 序列化

    在 .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[];
}
    以上示例将对象序列化后,写入内存流中。你可以换成文件流(FileStream),这样就可以实现对象的持久化。

    3. 二进制序列化

    从理论上说,二进制序列化无论是性能还是序列化后的数据流大小都比XML序列化更具优势,这个我曾经在《实战 Web Service 压缩传输》的PPT和Demo 中深入分析过。.NET CF 2.0 并没有提供二进制序列化的类,如果你想在 .NET CF 2.0 中进行二进制序列化,可以通过第三方的开源组件 CompactFormatter 来实现。我在去年5月份就介绍过 CompactFormatter,详细请看 让 .NET Compact Framework 支持 Binnary Serialization。由于 CompactFormatter 同时支持 .NET CF 和 .NET Framework,我们可以将 CompactFormatter 序列化后的数据流可以转换为 byte[],并传输到服务器后进行反序列化。

    今天我简单介绍一下 CompactFormatter 的使用,用来跟上面的XML序列化进行比较。

    为了让一个实体类能够被 CompactFormatter 序列化,首先需要将这个实体类加上  [CompactFormatter.Attributes.Serializable()] 特性。

[CompactFormatter.Attributes.Serializable()]
public class Customer {
  
public Customer() { }

  
}
    然后重写 Equals 方法。
public override bool Equals(object obj)
{
  if (!obj.GetType().Equals(typeof(Customer)))
  {
    return false;
  }
  else
  {
    Customer answer = (Customer)obj;
    return (answer.ID == ID && answer.Name == Name);
  }
}
    就如上面的代码中,我将实体类 Customer 加上 [CompactFormatter.Attributes.Serializable()] 特性,并重写了它的 Equals 方法,现在可以使用 CompactFormatter 进行序列化了。
// 二进制序列化 Customer 数组
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
  CompactFormatter.CompactFormatter ser = new CompactFormatter.CompactFormatter();
  ser.Serialize(ms, customers);
  byte[] buffer = ms.ToArray();
}
0
相关文章