对象串行化(Serializable)例子 Java.io

 今日研究了下对象串行化,所以将学习体会写成博客,供大家参考,欢迎指正!

 


                        ****本文参考《Java技术及其应用》******************


                        ******在此表示感谢!****************************

                                 请路过者留下的你的文字


一、串行化概念及目的

      概念:

             对象寿命通常伴随着生成该对象程序终止而终止。有时候就可能需要将对象状态保存下来,在需要的时候将其恢复。

             对象记录自身的状态以便将来再生的能力叫做对象的持续性。对象通过写出自身的状态的数字来记录自己,这个过

             程为对象的串行化。

             理所当然串行化的主要任务:写出对象实例变量的数 值。如果对象是另一个对象的引用,则引用对象也要串行化。

             这个过程是递归的。


     目的:

            1. 尽量保持对象串行化简洁。

            2.串行化机制要严格助手java对象模型,对象串行化状态中应该报讯所有关于类的安全信息;

            3.对象串行化机制应支持Java对象的持续性。

            4.对象串行化机制应该有足够可扩展能力已支持对象的远程方法调用(Remote Method Invocation,RMI)。

            5.对象串行化应运行对象定义自身的格式,即其自身的数据流表示形式,可能接口外部化完成这项功能。


二、串行化方法

      自JDK1.1版本开始,Java语言提供了对象串行化机制,在java.io包中,接口Serializable被用来作为实现对象串行化的工具,

      Serializable中没有任何方法,声明实现一个Serializable接口时,仅仅表明该类参加串行化协议,无需实现任何方法。


三.串行化实现例子:

    1.定义一个可串行化的对象,实现Serializable接口。

         

import java.io.Serializable;

public class Student implements Serializable { // 实现 Serializable接口

    public int id;
    public int age;
    public String name;
    public String department;

    public Student(int id, String name, int age, String department) {

        this.id = id;
        this.name = name;
        this.age = age;
        this.department = department;
    }

}

 

2.构造对象输入/输出流

   要串行化一个对象,必须与一定的对象输出/输入流练习起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。

  java.io包中提供了ObjectInputStream 和ObjecOutputStream将数据流功能扩展到可读/科协对象,在ObjectInputStream中用 

  readObject()方法直接读取一个对象,在ObjectOutputStream中用writeObject()发发直接将对象保存到输出流中;

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectSer {

    public static void main(String[] args) throws IOException,
            ClassNotFoundException {

        String filepath = "./objdata.ser";
        Student stu = new Student(1000, "Jack", 20, "PSD");

        int i;

        FileOutputStream fos = new FileOutputStream(filepath);
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        try {
            oos.writeObject(stu); // 通读对象输出流将将对象状态保存下来
            oos.close();

        } catch (IOException e) {

            System.out.println("E1: " + e);
        }

        stu = null;

        FileInputStream fis = new FileInputStream(filepath);
        ObjectInputStream ois = new ObjectInputStream(fis);

        try {

            stu = (Student) ois.readObject();// 再通过对象输出流将对象恢复

            ois.close();

        } catch (IOException e) {

            System.out.println("E2: " + e);
        }

        System.out.println("Student info: ");
        System.out.println("ID:" + stu.id);
        System.out.println("Name:" + stu.name);
        System.out.println("Age:" + stu.age);
        System.out.println("Department:" + stu.department);

    }

}


本人JDK1.6,eclipse3.4上运行结果:

Student info:
ID:1000
Name:Jack
Age:20
Department:PSD


例子先定义一个Student类,实现Serializable接口,然后通过对象输出流writeObject()方法将stu对象保存到objdata.ser;

然后通过输入流readObject()方法从问及爱你中读取保存的Student对象。由此,通过串行化机制,可以正确地保存和恢复对象状态

 

串行化注意事项:

     1.串行化只能保存非静态成员变量,不能保存任何成员方法和静态成员变量,而且串行化所保存的只

     是 变量的值,对于任何修饰都不能保存。


     2.某些类型的对象,如关键字transient关键字修饰对象为瞬时的,这样的对象无法保持其状态,例如

        Thread对象,或一个FileInputStream对象,对其必须用transient关键字表明,否则编译器将报

        错。


    3.串行化涉及到将对象存放到磁盘或者在网络上发送数据,这时候就会产生安全性问题,因为数据位于

       Java运行环境之外,而不在Java安全机制掌握之中,对于这些需要保密字段,不应该保存在永久存

       放介质中,或者不应该简单的不家处理地保存下来。为了保证安全,应该在这些字段前面加上关键

       字transient.

   

 


   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>