灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3396回复:0

黑马程序员_java学习笔记_Java序列化和反序列化

楼主#
更多 发布于:2012-11-08 20:18

1、序列化是干什么的?

 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

 

2、什么情况下需要序列化

 a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

 b)当你想用套接字在网络上传送对象的时候;

 c)当你想通过RMI传输对象的时候;

 

 

 

下面再给个jdk宝典里的例子吧,这样你就应该知道怎么用了:

 

package book.io;

 

import java.io.FileInputStream;

 import java.io.FileOutputStream;

 import java.io.ObjectInputStream;

 import java.io.ObjectOutputStream;

 import java.io.Serializable;

 import java.util.Date;

 /**

  * 序列化和反序列化对象

  */

 public class SerializeObject {

  // 一个内部类,用于被序列化和反序列化。

  //一定要实现Serializable才能够被序列化和反序列化。

  static class MyClass implements Serializable{

   //一般的实例变量会被序列化和反序列化

      private int a,b;

      //transient实例变量 不会 被序列化和反序列化

      private transient int c;

      // 类变量 不会 被序列化和反序列化

      private static int d;

      public MyClass(){

      }

      public MyClass(int a, int b, int c, int d){

          this.a = a;

          this.b = b;

          this.c = c;

          MyClass.d = d;

      }

      public String toString(){

       return this.a + "  " + this.b + "  " + this.c + "  " + MyClass.d;

      }

  }

 

 /**

   * 序列化对象到文件

   */

     public static void serialize(String fileName) throws Exception{

      //创建一个对象输出流,将对象输出到文件

         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));

         //序列化一个字符串对象到文件

         out.writeObject("Today:");

         //序列化当前日期对象到文件

         out.writeObject(new Date());

         //序列化一个MyClass对象

         MyClass my1 = new MyClass(5, 6, 7, 8);

         out.writeObject(my1);

         out.close();

     }

     /**

      * 从文件反序列化到对象

      */

     public static void deserialize(String fileName) throws Exception{

      //创建一个对象输入流,从文件读取对象

         ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));

         //注意读对象时必须按照序列化对象时的顺序读,否则会出错

         //读取字符串对象

         String today = (String)(in.readObject());

         System.out.println(today);

         //读日期对象

         Date date = (Date)(in.readObject());

         System.out.println(date.toString());

         //读MyClass对象,并调用它的add方法。

         MyClass my1 = (MyClass)(in.readObject());

         System.out.println(my1.toString());

         in.close();

         //当恢复对象的时候,对象中的所有域被自动的恢复。如果不希望某个域被序列化,可以在它前面

         //加上transient关键字,例如下面的代码:transient int noSer = 0;

         //类似的,如果类中的某个域为静态,它不会被序列化。

     }

  /**

   * @param args

   */

  public static void main(String[] args) throws Exception{

   String fileName = "c:/temp/MyClass.ser";

   SerializeObject.serialize(fileName);

   //注释掉第二行,只运行下面一行,将会发现输出不同

   SerializeObject.deserialize(fileName);

  }

 }


喜欢0 评分0
游客

返回顶部