ITPub博客

首页 > 应用开发 > Java > java序列化

java序列化

原创 Java 作者:爆seed 时间:2014-12-22 15:14:43 0 删除 编辑
       Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的串行化机制是RMI、EJB等技术的技术基础。用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。
      正常情况下,JVM启动后,我们可以创建对象生存其内,JVM关闭后,我们创建过的对象都随之销毁,资源释放。但有些时候可能要求在JVM停止之后,某些对象需要保存起来,以便将来再重新读取它们。举个例子,应用服务器的HttpSession对象,Session是指浏览器与服务器之间的一次会话,对应的是服务器中的一个Session对象,而客户端中保存一个jsessionid,这里回忆一下Session的知识,之前有文章详细的解析过Session,见Session深度解析。那么当某种情况下,我们不得不重启服务器的时候,就需要把之前所有的Session对象保存起来,服务器重启之后,将这些Session对象再重新加载过来,这样避免了之前浏览器与服务器建立的会话失效,在浏览器那看来,就好象服务器没有关闭过一样(假设服务器重启期间用户没有操作)。这就用到了Java序列化技术,关于这个例子,我们可以拿Tomcat来测试一下,注意要用正常的手段来关闭服务器(shutdown.bat),而非强制关闭,强制关闭没有序列化的过程。

       序列化的实现:将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

2、串行化的特点:


    (1)如果某个类能够被串行化,其子类也可以被串行化。如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可串行化接口。则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可串行化接口,则该类的父类所有的字段属性将不会串行化。


  (2)声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据;


  (3)相关的类和接口:在java.io包中提供的涉及对象的串行化的类与接口有ObjectOutput接口、ObjectOutputStream类、ObjectInput接口、ObjectInputStream类。


    (1)ObjectOutput接口:它继承DataOutput接口并且支持对象的串行化,其内的writeObject()方法实现存储一个对象。ObjectInput接口:它继承DataInput接口并且支持对象的串行化,其内的readObject()方法实现读取一个对象。


    (2)ObjectOutputStream类:它继承OutputStream类并且实现ObjectOutput接口。利用该类来实现将对象存储(调用ObjectOutput接口中的writeObject()方法)。ObjectInputStream类:它继承InputStream类并且实现ObjectInput接口。利用该类来实现读取一个对象(调用ObjectInput接口中的readObject()方法)。


  对于父类的处理,如果父类没有实现串行化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。在反串行化的时候,默认构造函数会被调用。但是若把父类标记为可以串行化,则在反串行化的时候,其默认构造函数不会被调用。这是为什么呢?这是因为Java 对串行化的对象进行反串行化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。

import java.io.*;


public class Cat implements Serializable {


        private String name;


        public Cat () {


                this.name = "new cat";


        }


        public String getName() {


                return this.name;


        }


        public void setName(String name) {


                this.name = name;


        }


        public static void main(String[] args) {          


                Cat cat = new Cat();


                try {


                        FileOutputStream fos = new FileOutputStream("catDemo.out");


                        ObjectOutputStream oos = new ObjectOutputStream(fos);


                        System.out.println(" 1> " + cat.getName());


                        cat.setName("My Cat");                        


                        oos.writeObject(cat);


                        oos.close();                        


                } catch (Exception ex) {  ex.printStackTrace();   }


                try { 


                        FileInputStream fis = new FileInputStream("catDemo.out");


                        ObjectInputStream ois = new ObjectInputStream(fis);


                        cat = (Cat) ois.readObject();


                        System.out.println(" 2> " + cat.getName());


                        ois.close();


                } catch (Exception ex) {


                        ex.printStackTrace();


                }


        }


}


        序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。就好比是我们学习Java的时候要从网上下载一些java视频教程,下载的时候肯定是一个字节一个字节的下载,完成之后我们就可以学习了,而不是一下子全部下载下来。      
     只要努力就一定会有收获,java开发是一个不断学习的职业,只有不断的学习,才能练成更高的境界。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29917475/viewspace-1376086/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: java开发学习路线
请登录后发表评论 登录
全部评论

注册时间:2014-09-26

  • 博文量
    28
  • 访问量
    34438