序列化和反序列化

来源:互联网 发布:易凯软件手册 编辑:程序博客网 时间:2024/05/29 19:03
1. 一个类若想被序列化,则需要实现java.io.Serializable  接口,该接口中没有定义任何 
   方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个 
   类的对象是可以序列化的。 
2. 在序列化时,static 变量是无法序列化的;如果A 包含了对B 的引用,那么在序列化 
   A  的时候也会将B 一并地序列化;如果此时A 可以序列化,B 无法序列化,那么当 
   序列化A  的时候就会发生异常,这时就需要将对B 的引用设为transient ,该关键字 

   表示变量不会被序列化。 


3.  当我们在一个待序列化/反序列化的类中实现了以上两个 private  方法(方法声明要 
   与上面的保持完全的一致),那么就允许我们以更加底层、更加细粒度的方式控制序 
   列化/反序列化的过程。 

package com.fgh.serializable;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 如果需要特出处理 需要实现writeObject和readObject  * 这两个方法不属于任何一个类和任何一个接口 是非常特殊的方法 * 让自己控制序列化和反序列化的过程 * @author fgh *  */public class SerializableTest2 {public static void main(String[] args) throws Exception {Person2 Person21 = new Person2("zhangsan", 21, 56.34);Person2 Person22 = new Person2("lisi", 24, 23.42);Person2 Person23 = new Person2("wangwu", 65, 67.45);/** * 序列化 把信息保存到磁盘上 */try {FileOutputStream fos = new FileOutputStream("Person2.txt");ObjectOutputStream ooStream = new ObjectOutputStream(fos);ooStream.writeObject(Person21);ooStream.writeObject(Person22);ooStream.writeObject(Person23);System.out.println("write success");ooStream.close();System.out.println("===================");/** * 把文件中内容读取到内存中 反序列化时不会调用对象的任何构造方法,仅仅根据所保存的对象状态信息 在内存中重新构建对象 */FileInputStream fis = new FileInputStream("Person2.txt");ObjectInputStream ois = new ObjectInputStream(fis);try {Person2 p = null;for (int i = 0; i < 3; i++) {p = (Person2) ois.readObject();System.out.println("第" + Integer.valueOf(i + 1) + "个" + ":"+ p.getName() + "," + p.getAge() + ","+ p.getHeight() + ";");}} catch (ClassNotFoundException e) {e.printStackTrace();}ois.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}class Person2 implements Serializable {private static final long serialVersionUID = 2605116530076131408L;// 加上transient 关键字 该属性将不会被保存private String name;private int age;private double height;public Person2(String name, int age, double height) {super();this.name = name;this.age = age;this.height = height;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}/** * 如果需要特殊处理 需要实现这两个方法 *  * @param out * @throws IOException */private void writeObject(ObjectOutputStream out) throws IOException {System.out.println("write Object...");}private void readObject(ObjectInputStream in) throws IOException {System.out.println("read Object...");}}



原创粉丝点击