常常看到有人写的代码给类添加serializable属性,如petshop的Model必,都有.
我网上搜索一下,这个是什么系列化的代码,书我也看了,就是不知道说什么.好象要与不要,程序都能运行,那要与不要有什么区别啊?!到底是什么作用,能不能简单的说一下.

解决方案 »

  1.   

    这就是序列化,下面是对序列化的一个简单描述:
    什么是序列化?
      ---.net的运行时环境用来支持用户定义类型的流化的机制。它是将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
      
      序列化的目的:
      1、以某种存储形式使自定义对象持久化;
      2、将对象从一个地方传递到另一个地方。
      
      实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。而要想实际的写出这个流,就要使用那些实现了IFormatter接口的类里的Serialize和Deserialize方法。
      在.net框架里提供了这样两个类:
      
      一、BinaryFormatter
      
      BinaryFormatter使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化。
      
      首先我们创建一个类:
      [Serializable]
      public class MyObject {
       public int n1 = 0;
       public int n2 = 0;
       public String str = null;
      }
      Serializable属性用来明确表示该类可以被序列化。同样的,我们可以用NonSerializable属性用来明确表示类不能被序列化。
      接着我们创建一个该类的实例,然后序列化,并存到文件里持久:
      MyObject obj = new MyObject();
      obj.n1 = 1;
      obj.n2 = 24;
      obj.str = "一些字符串";
      IFormatter formatter = new BinaryFormatter();
      Stream stream = new FileStream("MyFile.bin", FileMode.Create, 
      FileAccess.Write, FileShare.None);
      formatter.Serialize(stream, obj);
      stream.Close();
      
      而将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。
      IFormatter formatter = new BinaryFormatter();
      Stream stream = new FileStream("MyFile.bin", FileMode.Open, 
      FileAccess.Read, FileShare.Read);
      MyObject obj = (MyObject) formatter.Deserialize(fromStream);
      stream.Close();
      
      // 下面是证明
      Console.WriteLine("n1: {0}", obj.n1);
      Console.WriteLine("n2: {0}", obj.n2);
      Console.WriteLine("str: {0}", obj.str);
      
      二、SoapFormatter
      
      前面我们用BinaryFormatter以二进制格式来序列化。很容易的我们就能把前面的例子改为用SoapFormatter的,这样将以xml格式化,因此能有更好的可移植性。所要做的更改只是将以上代码中的格式化程序换成 SoapFormatter,而 Serialize 和 Deserialize 调用不变。对于上面使用的示例,该格式化程序将生成以下结果。
      
          xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/
       xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/
       SOAP-ENV:encodingStyle=
       "http://schemas.microsoft.com/soap/encoding/clr/1.0
       http://schemas.xmlsoap.org/soap/encoding/"
       xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile">
      

  2.   

    微软的 asp.net 项目组看来做了很多工作,对于WebService和WCF,你不需要再去花心思去学这个 Serializable(如果有闲空可以学学)。现在可以说不需要这个标记了,因为默认地.net的序列化器会智能化地序列几乎所有对象属性,不需要你手动写序列化代码。如果你希望将自定义对象放入 ViewState,可以使用 Linq to XML 或者任何一种你熟悉 linq to XXX 实现,将对象放入数据库、外部缓存等,仅在ViewState中保存对象的主键信息(通常为string或者long值)。
      

  3.   

    Serializable曾经很关键。但是现在,首先使用上述的东西实现大规模应用,然后在有时间时根据它们在异构的系统之间通讯的机理反过来在研究数据流格式转换(序列化、反序列化)问题,会更有效率。