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 = "小洋仔"; }