Java 实现序列化和反序列化

  1 package com.io.homework;
  2 
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.FileInputStream;
  6 import java.io.FileNotFoundException;
  7 import java.io.FileOutputStream;
  8 import java.io.IOException;
  9 import java.io.ObjectInputStream;
 10 import java.io.ObjectOutputStream;
 11 import java.io.Serializable;
 12 import java.util.ArrayList;
 13 import java.util.Iterator;
 14 import java.util.List;
 15 
 16 import org.junit.Test;
 17 
 18 /**
 19  *序列化和反序列化
 20  */
 21 public class SerializeDemo{
 22      
 23     /*
 24      * 序列化 : 创建三个不同的Person对象,将这三个对象序列化到文件中;
 25      */
 26     @Test
 27     public void serializeTest() {
 28         Person person1 = new Person("李明", 24, 60.2);
 29         Person person2 = new Person("jack", 22, 67.5);
 30         Person person3 = new Person("斯密瑟", 26, 70.2);
 31         List<Person> list = new ArrayList<>();
 32         list.add(person1);
 33         list.add(person2);
 34         list.add(person3);
 35 
 36         // 3、创建ObjectOutputStream 的实例完成序列化
 37         ObjectOutputStream oos = null;
 38         try {
 39             // 1、创建输出流 FileOutputStream
 40             FileOutputStream fos = new FileOutputStream("./serialize.dat");
 41             // 2、创建缓冲包装节点流
 42             BufferedOutputStream bos = new BufferedOutputStream(fos);
 43             oos = new ObjectOutputStream(bos);
 44             // 4、通过标识对应的数据类型,将数据写入目标地点
 45             oos.writeObject(list);
 46         } catch (IOException e) {
 47             e.printStackTrace();
 48         } finally {
 49             // 5、关闭流
 50             if (oos != null) {
 51                 try {
 52                     oos.close();
 53                 } catch (IOException e) {
 54                     e.printStackTrace();
 55                 }
 56             }
 57         }
 58         System.out.println("写入成功!!");
 59 
 60     }
 61 
 62     /*
 63      * 反序列化:三个Person对象,打印输出。验证序列化的正确;
 64      */
 65     @Test
 66     public void deserializationTest() {
 67         // 2. 创建 ObjectInputStream 的实例,包装现有节点流,用于完成反序列化
 68 
 69         ObjectInputStream ois = null;
 70         try {
 71             // 1. 创建 FileInputStream 的实例
 72             FileInputStream fis = new FileInputStream("./serialize.dat");
 73             BufferedInputStream bis = new BufferedInputStream(fis);
 74             ois = new ObjectInputStream(bis);
 75 
 76             @SuppressWarnings("unchecked")
 77             List<Person> list = (List<Person>) ois.readObject();
 78             Iterator<Person> it = list.iterator();
 79 
 80             // 3. 读取文件的内容
 81             while (it.hasNext()) {
 82                 Person person = it.next();
 83                 System.out.println(person);
 84             }
 85         } catch (FileNotFoundException e) {
 86             e.printStackTrace();
 87         } catch (ClassNotFoundException e) {
 88             e.printStackTrace();
 89         } catch (IOException e) {
 90             e.printStackTrace();
 91         } finally {
 92             if (ois != null) {
 93                 try {
 94                     ois.close();
 95                 } catch (IOException e) {
 96                     e.printStackTrace();
 97                 }
 98             }
 99         }
100 
101     }
102 }
103 
104 //编写Person类,包含姓名、年龄、体重等属性,提供对应的访问方法;
105 class Person implements Serializable {
106 
107     private static final long serialVersionUID = 314398401529574184L;
108     private String name;// 姓名
109     private Integer age;// 年龄
110     private double whight;// 体重
111 
112     /**
113      * @param name
114      * @param age
115      * @param whight
116      */
117     public Person(String name, Integer age, double whight) {
118         super();
119         this.name = name;
120         this.age = age;
121         this.whight = whight;
122     }
123 
124     public Person() {
125         super();
126     }
127 
128     /**
129      * @return the name
130      */
131     public String getName() {
132         return name;
133     }
134 
135     /**
136      * @param name the name to set
137      */
138     public void setName(String name) {
139         this.name = name;
140     }
141 
142     /**
143      * @return the age
144      */
145     public Integer getAge() {
146         return age;
147     }
148 
149     /**
150      * @param age the age to set
151      */
152     public void setAge(Integer age) {
153         this.age = age;
154     }
155 
156     /**
157      * @return the whight
158      */
159     public double getWhight() {
160         return whight;
161     }
162 
163     /**
164      * @param whight the whight to set
165      */
166     public void setWhight(double whight) {
167         this.whight = whight;
168     }
169 
170     @Override
171     public String toString() {
172         return "Person [name=" + name + ", age=" + age + ", whight=" + whight + "]";
173     }
174 
175 }

 

posted @ 2020-03-17 00:38  蜜桃先生  阅读(471)  评论(0编辑  收藏  举报