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 }
原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5026147.html