io流序列化和反序列化测试

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标准流异常处理代码不用手动关闭流
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值