00 前言
-
1.上一篇文章使用markdown编辑器编辑,由于初次使用,造成了很大的不便,所以想了一下干脆把所有的内容都写都到代码注释里,这样更加方便快捷,等会用markdown编辑器了再进行统一排版吧,先就这么的了
-
2.所有的文件路径都没有写死,都使用传参的方式,方便代码复用
01 实体类
/**
* 要序列化的类必实现Serializable接口,该接口时一个空接口,可以肯做一个标记,
* 允许被序列化和反序列化的标记
* @author yzm
*
*/
class People implements Serializable{
/**
* Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID
* 该版本号的目的在于验证序 列化的对象和对应类是否版本匹配。
*/
static final long serialVersionUID = 131415926L;
private int id;
private String name;
private double higet;
// transient关键字修饰瞬态成员,不会被序列化,不管怎样复制,反序列化取出到程序中时都为为默认值,这里为0.0(double数据类型默认值)
private transient double weiget;
public People() {
super();
// TODO Auto-generated constructor stub
}
public People(int id, String name, double higet, double weiget) {
super();
this.id = id;
this.name = name;
this.higet = higet;
this.weiget = weiget;
}
public long getSerialversionuid() {
return serialVersionUID;
}
@Override
public String toString() {
return "people [id=" + id + ", name=" + name + ", higet=" + higet + ", weiget=" + weiget + ",serialVersionUID=" + serialVersionUID +"]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getHiget() {
return higet;
}
public void setHiget(double higet) {
this.higet = higet;
}
public double getWeiget() {
return weiget;
}
public void setWeiget(double weiget) {
this.weiget = weiget;
}
}
02 序列化和反序列化单个对象
package com.yzm.serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 案例一:序列化和反序列化一个对象
* 要求:1.将java对象序列化(或者持久化)到文件中
* 即将对象装换为字节持久化到硬盘
* 2.将对象反序列化从文件中取出到程序中(字节文件转换为java对象)
* @author yzm
*
*/
public class DemoSerialize {
/**
* 运行结果:
* people [id=2, name=李四, higet=171.05, weiget=0.0]
* 分析:weiget属性添加了transient关键字,表示该属性不能被序列化
* 反序列化取出时weiget属性的值为double数据类型默认值:0.0。
* @param args
*/
public static void main(String[] args) {
//创建对象
People p1 = new People(1,"张三",170.05,130.05);
People p2 = new People(2,"李四",171.05,131.05);
serialize(p1,"a.txt");
serialize(p2,"a.txt");
deserialize("a.txt");
}
/**
* 序列化两个对象到文件中,从文件中反序列化取出一个对象到程序中没任何问题
* 但是如果想要取出两个对象则报异常:java.io.EOFException
* @param filePath
*/
private static void deserialize(String filePath) {
try(
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
){
//反序列化
People p1 = (People)ois.readObject();
//此种方式只能取出第二个对象时报异常:java.io.EOFException
//People p2 = (People)ois.readObject();
System.out.println(p1);
//System.out.println(p2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
private static void serialize(People p,String filePath) {
try(
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
){
//开始序列化
oos.writeObject(p);
} catch (IOException e) {
e.printStackTrace();
}
//同样的使用jdk7标准流异常处理代码不用手动关闭流
}
}
03 序列化和反序列化多个对象(集合方式)
注
此处用到的实体类依然沿用案例一中的实体类
package com.yzm.serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 案例二:序列化和反序列化多个对象
* 要求:1.将多个java对象序列化到文件中
* (通过序列化集合实现)
* 2.将多个对象反序列化从文件中取出到程序中
* (通过反序列化集合实现)
* @author yzm
*
*/
public class DemoSerializeList {
/**
* 运行结果:
* 序列化版本号:131415926
people [id=1, name=张三, higet=170.05, weiget=0.0,serialVersionUID=131415926]
---------
序列化版本号:131415926
people [id=2, name=李四, higet=171.05, weiget=0.0,serialVersionUID=131415926]
---------
序列化版本号:131415926
people [id=3, name=王五, higet=172.05, weiget=0.0,serialVersionUID=131415926]
---------
* 分析:
*
* 完全在意料之中
* @param args
*/
public static void main(String[] args) {
//创建对象
People p1 = new People(1,"张三",170.05,130.05);
People p2 = new People(2,"李四",171.05,131.05);
People p3 = new People(3,"王五",172.05,132.05);
List<People> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
serialize(list,"c.txt");
deserialize("c.txt");
}
/**
*
* 反序列化集合(多个对象)
* @param filePath
*/
private static void deserialize(String filePath) {
try(
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
){
//反序列化
List<People> list = (List<People>)ois.readObject();
for (People people : list) {
System.out.println("序列化版本号:" + people.getSerialversionuid());
System.out.println(people);
System.out.println("---------");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
//关流
//说了很多次了,只要是实现了AutoCloseable接口的类,会自动调用close()方法,
//毫无疑问序列化的两个流都实现了这个接口
}
private static void serialize(List<People> list,String filePath) {
try(
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
){
//开始序列化
oos.writeObject(list);
} catch (IOException e) {
e.printStackTrace();
}
//同样的使用jdk7标准流异常处理代码不用手动关闭流
}
}