6-对象流(对象的序列化)
1 package com.io; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.ObjectInputStream; 8 import java.io.ObjectOutputStream; 9 import java.io.Serializable; 10 11 import org.junit.Test; 12 13 /** 14 * 15 * 1、对象的序列化机制:把内存中的java对象转换成与平台无关的二进制流, 16 * 持久地保存地磁盘上或通过网络传输到另一个节点 17 * 2、反序列化: 当其它程序获取了这种二进制流以后,可以恢复成原来的对象 18 * 19 * 20 */ 21 public class 对象流 { 22 @Test 23 public void objOutputStreamTest(){ 24 Person p1 = new Person("小明",22); 25 Person p2 = new Person("小红",23); 26 27 ObjectOutputStream oos = null; 28 try { 29 oos = new ObjectOutputStream(new FileOutputStream(new File("obj.txt"))); 30 oos.writeObject(p1); 31 oos.writeObject(p2); 32 oos.flush(); 33 } catch (IOException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 }finally{ 37 try { 38 oos.close(); 39 } catch (IOException e) { 40 e.printStackTrace(); 41 } 42 } 43 } 44 45 @Test 46 public void readObject(){ 47 ObjectInputStream ois = null; 48 try { 49 ois = new ObjectInputStream(new FileInputStream(new File("obj.txt"))); 50 51 Person p1 = (Person) ois.readObject(); 52 Object p2 = (Object)ois.readObject(); 53 System.out.println(p1); 54 System.out.println(p2); 55 } catch ( IOException e) { 56 // TODO Auto-generated catch block 57 e.printStackTrace(); 58 } catch (ClassNotFoundException e) { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 }finally{ 62 try { 63 ois.close(); 64 } catch (IOException e) { 65 // TODO Auto-generated catch block 66 e.printStackTrace(); 67 } 68 } 69 } 70 } 71 72 /** 73 * 74 * @author Administrator 75 *要实现序列化的类要求: 76 *(1)类是可序列化的:实现Serializable接口 77 *(2)类的属性是可序列化的,属性也继承Serializable接口 78 *(3)使用static 和 transient关键字修饰的属性不可被序列化 79 *(4)提供一个版本号serialVersionUID 80 */ 81 82 83 /* 84 * 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量: 85 private static final long serialVersionUID; 86 serialVersionUID用来表明类的不同版本间的兼容性 87 如果类没有显示定义这个静态变量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的源代码作了修改,serialVersionUID 可能发生变化。故建议,显示声明 88 显示定义serialVersionUID的用途 89 希望类的不同版本对序列化兼容,因此需确保类的不同版本具有相同的serialVersionUID 90 不希望类的不同版本对序列化兼容,因此需确保类的不同版本具有不同的serialVersionUID 91 92 */ 93 class Person implements Serializable{ 94 /** 95 * 96 */ 97 private static final long serialVersionUID = -8305586168290840729L; 98 99 private String name ; 100 101 private int age; 102 103 public Person(String name,Integer age){ 104 this.name = name; 105 this.age = age; 106 } 107 108 /* (non-Javadoc) 109 * @see java.lang.Object#toString() 110 */ 111 @Override 112 public String toString() { 113 return "Person [name=" + name + ", age=" + age + "]"; 114 } 115 116 117 }