java编程笔记17 对象串行化
在前面我们学习了用一些特定的方法可以将int,double等类型的数据进行输入输出处理。现在假设我们有一个Student类,每个Student对象包含了姓名,语文,数学,英语的成绩。姓名是String类型,成绩是int类型,现在想把Student对象的数据保存下来,你会想到什么办法?当然,用前面的办法可以用writeInt等方法输出到文件中,用readInt等方法从文件中读出来,可是如果我们遇到一个不止思想数据的对象呢???
对象串行化就是直接把整个对象做输入输出处理,java提供了一种机制来完成这个工作,它的名字就叫串行化Serialization,简单的说,就是把对象中的属性,按照流的方法来做输入输出处理,这里要注意,只有属性可以做串行化处理,因为属性是变量,可以存储数据,方法是程序代码,做输出输入处理没有意义。
只要一个类实现了Serializable接口,这个类的对象就可以串行化,Serializable接口是个标记接口,标记接口是指没有定义任何的成员,简单地说就是一个空接口,在前面学习对象复制的时候Cloneable接口也是空接口。实现标记接口的类内部不需要做任何改变(接口没有方法让它去实现);
下面我们来写一个可以串行化的类:(这里有个问题,结果在文件里是乱码,不过不影响再从文件获取数据)
package ch21; import java.io.*; //Student类实现了Serializable接口,所以它的对象可以串行化输入输出 public class Student implements Serializable { private String name; private int chScore, engScore; private transient int mathScore;//transient用于修饰希望在串行化过程中不想被串行化的属性 public Student(String n, int c, int e, int m) { name = n; chScore = c; engScore = e; mathScore = m; } public double avgScore() { return (chScore+engScore+mathScore)/3.0; } public void printData() { System.out.println("姓名:"+name); System.out.println("语文:"+chScore); System.out.println("英文:"+engScore); System.out.println("数学:"+mathScore); System.out.println("平均:"+avgScore()); } }
写一个类来写串行化数据:
package ch21; import java.io.*; public class ObjectSerializationExample1 { public static void main(String argv[]) { int c = Integer.parseInt(argv[1]); int e = Integer.parseInt(argv[2]); int m = Integer.parseInt(argv[3]); Student st = new Student(argv[0], c, e, m); st.printData(); try { FileOutputStream fout = new FileOutputStream("C:\\Data.txt"); ObjectOutputStream objOut = new ObjectOutputStream(fout);//数据流连接机制!!! objOut.writeObject(st);//写串行化对象 objOut.close(); fout.close(); } catch (IOException ie) { System.err.println(e); } } }
读出串行化数据:
package ch21; import java.io.*; public class ObjectSerializationExample2 { public static void main(String argv[]) { try { FileInputStream fin = new FileInputStream("Data.txt"); ObjectInputStream objIn = new ObjectInputStream(fin);//数据流连接!!! Student st = (Student)objIn.readObject();//获取串行化数据 st.printData(); objIn.close(); fin.close(); } catch (Exception e) { System.err.println(e); } } }
结果:
姓名:java
语文:90
英文:80
数学:0
平均:56.666666666666664
可以看transient关键字发生了作用