Java(串行化)

对象的寿命通常随着生成该对象的程序终止而终止。某些时候,需要将对象的状态保存下来,将来需要的时候可以恢复。
把对象的这种记录自己状态以便将来再生的能力,叫做对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己的过程,叫做对象的串行化(serialization)
串行化的主要任务是写出对象实例变量的数值。如果变量是另一个对象的引用,则引用的对象也要串行化。
Java提供了对像串行化的机制,在java.io包中定义了一些接口和类作为对象串行化的工具。
1.Serializable接口
只有实现Serializable接口的对象才可以被串行化工具存储和恢复。Serializable接口没有定义任何成员。它只有一个类可以被串行化。如果一个类可以串行化,它的所有子类都可以串行化。
2.ObjectOutput接口
ObjectOutput继承自DataOutput接口并且支持对象的串行化,它的writeObject()方法可以输出一个对象。所有这些方法在出错情况下引发IOException异常。
fianl void writeObject(Object obj)//向流写入对象obj
3.ObjectOutputStream类
ObjectOutputStream类继承自OutputStream类并且实现了ObjectOutput接口,它负责向流写入对象。该类的构造函数
ObjectOutputStream(OutputStream out)throws IOException
参数out是串行化的对象将要写入的输出流
4.ObjectInput接口
ObjectInput接口继承自DataInput接口,它支持对象反串行化,其readObject()方法可以反串行化对象。所有这些方法在出错情况下引发IOException异常。
Object readObject()从流读取一个对象
5.ObjectInputStream
ObjectInputStream 继承自InputStream类并且实现了ObjectInput接口。ObjectInputStream负责从流中读取对象
构造函数如下
ObjectInputStream(InputStream in)
参数in是串行化对象将被读取的输入流
6.串行化注意事项
(1)串行化只能保存对象的非静态成员变量,不保存变量的修饰符。
(2)对于某些类型的变量,其状态是瞬时的,无法或无须保存其状态,对于这些变量,可以用transient关键字标明。
对于一些需要保密的变量,为了保证安全性,不应该串行化,可以在其前面加上transient关键字。

import java.io.Serializable;

class Student implements Serializable {
    private static final long serialVersionUID=1L;
    int id;
    String name;
    int age;

    String department;
    public Student(int id,String name,int age,String department)
    {
        this.id=id;
        this.name=name;
        this.age=age;
        this.department=department;
    }
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class SerializableDemo {
    public static void main(String[] args)throws Exception {
        Student stu=new Student(20061064,"zhang shan",22, "CQUCS");
        FileOutputStream fout=new FileOutputStream("datal.ser");
        ObjectOutputStream oout=new ObjectOutputStream(fout);
        oout.writeObject(stu);
        oout.close();
        stu=null;
        FileInputStream fin=new FileInputStream("datal.ser");
        ObjectInputStream oin=new ObjectInputStream(fin);
        stu=(Student)oin.readObject();
        oin.close();
        System.out.println("学生信息:");
        System.out.println("ID         "+stu.id);
        System.out.println("name:      "+stu.name);
        System.out.println("age:       "+stu.age);
        System.out.println("department:"+stu.department);       
    }
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值