首页 > 代码库 > java对象流与序列化

java对象流与序列化

Object流,直接把obj写入或读出.

前言:

比如 画图的程序,咣当画一个三角形出来,咣当画一正方形出来。然后存盘,当你下次再打开软件的时候三角形、方块还在原来的位置上。如果用面向对象的思维,三角形,方块都有自己的成员变量,x、y坐标、颜色、线的颜色、粗细等,你存盘的时候要把这些内容写到硬盘上,写到文件里,这叫存盘。比如说一个方块,你存盘的时候只要把起始点的坐标,宽度,高度颜色等等存进去,当再显示的时候再在原处把它画出来。

技术分享

序列化:把一个object直接转换成字节流写到硬盘上或者写到网络上。

实际在内存中会new出方块的一个对象来,有它各种的属性,存盘的时候要挨着把这些属性都给存到文件里,用DataOutputStream就可以实现,不管它的属性是int,dubbo等。既然把这个object的内容都要写到硬盘上,何不把整个object全部写进去呢,因为把object  new出来的时候无非也就是内存里的一块区域,也就是一个字节一个字节的,干脆把整个字节,这一小块内存全都写进硬盘,更合适,更方便,这就是object的初衷。当然New出来的对象除了自己的属性外,还有标识object的版本号,this、super指针,相关的内容都会写进去。这就是object流的作用。这就是序列化。

技术分享

java.io.Serializable:

可序列化的。如果想吧一个类的对象写到硬盘上或者网络上,想把它序列化成一个字节流,必须实现序列化接口。

可序列化类的所有子类型本身都是可序列化的。

没有方法,标记性的接口,给编译器看的,编译器看到这个接口后就知道这个类能被序列化。

例子程序:

package lhy.io;import java.io.*;public class TestObjectIO {    public static void main(String args[]) throws Exception {        T t = new T();        t.k = 8;        //写对象,.dat保存数据的文件        //文件输出流        FileOutputStream fos = new FileOutputStream("d:/share/testobjectio.dat");        //套一层对象输出流        ObjectOutputStream oos = new ObjectOutputStream(fos);        //写对象        oos.writeObject(t);        oos.flush();        oos.close();                //读取        FileInputStream fis = new FileInputStream("d:/share/testobjectio.dat");        ObjectInputStream ois = new ObjectInputStream(fis);        //读一个Object        T tReaded = (T)ois.readObject();        //10  9  2.3  0   小洋仔,transient标识的成员变量k,不能被序列化,是int默认值0        System.out.println(tReaded.i + " " + tReaded.j + " "                     + tReaded.d + " " + tReaded.k+" "+tReaded.str);            }}/** * 实现序列化接口 */class T implements Serializable{    int i = 10;    int j = 9;    double d = 2.3;    //transient:透明的,序列化的时候不予考虑    transient int k = 15;    String str = "小洋仔";}

 

java对象流与序列化