Java教程

Java序列化与反序列化

本文主要是介绍Java序列化与反序列化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

知识点

代码(伪)

代码(全)


知识点

序列化:

百度:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

反序列化:

反序列化是序列化的逆向过程,如果说序列化是为了写入,那反序列化就是为了读取

代码(伪)

先写伪代码,全部代码请移步“代码(全)”。

首先我们需要一个类来定义需要存哪些数据:

class Person implements Serializable {
	//序列id
	private static final long serialVersionUID = -7258009537827358766L;
	
	//定义变量
	private String name;
	private int age;
	
	//定义getName和setName等函数,用于输出数据和设置数据。
	//可以用eclipse中(鼠标右键)->(source)->(Generate Getters and Setters)自动生成
	public String getName() {}
	public void setName(String name) {}
	public int getAge() {}
	public void setAge() {}
	
	//用于输出姓名年龄。
	public String toString() {}
}

然后我们写序列化:

//实例化Person类,接下来给其赋值。
Person s1=new Person();
//setName和setAge是Person类中定义的方法
s1.setName("张三");
s1.setAge(20);
		
//FileOutputStream用于确定存储地址
FileOutputStream fStream =new FileOutputStream("D:\\text\\test.txt");
//ObjectOutputStream用于写入数据
ObjectOutputStream out = new ObjectOutputStream(fStream);
//用writeObject方法,写入s1对象
out.writeObject(s1);
System.out.println("写入成功");
//随手关闭是个好习惯
out.close();

结果:

记事本显示的是乱码?没关系,因为序列化后存入的是一个二进制串,记事本没有与之匹配的编码格式用于读取,我们需要用反序列化读取数据。

反序列化:

/*反序列化*/
//FileInputStream用于确定存储地址
FileInputStream fStream =new FileInputStream("D:\\text\\test.txt");
//ObjectInputStream用于读取数据
ObjectInputStream in = new ObjectInputStream(fStream);
//我们需要实例化一个Person类来接收数据
Person per = (Person) in.readObject();
//这里的toString()在Person类中重写过,用于输出数据。
System.out.println(per.toString());
//不要忘了关
in.close();

结果:

成功调用toString()方法读取数据。

代码(全)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class test {
	
	public static void main(String[] args) {
		Person s1=new Person();//实例化Person类,接下来给其赋值。
		s1.setName("张三");
		s1.setAge(20);
		try{
			/*序列化*/
			FileOutputStream fStream =new FileOutputStream("D:\\text\\test.txt");//选择用于存储的文件
			ObjectOutputStream out = new ObjectOutputStream(fStream);
			out.writeObject(s1);//写入s1对象
			System.out.println("写入成功");
			out.close();//随手关闭是个好习惯
			
			/*反序列化*/
			/*FileInputStream fStream =new FileInputStream("D:\\text\\test.txt");
			ObjectInputStream in = new ObjectInputStream(fStream);
			Person per;
			try {
				per = (Person) in.readObject();
				System.out.println(per.toString());//这里的toString()在Person类中重写过,用于输出数据。
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			in.close();*/
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
class Person implements Serializable {
	/*序列化与反序列化需要Serializable来定义id,没有会报错*/
	private static final long serialVersionUID = -7258009537827358766L;
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String toString() {
		return "person:name="+name+",age="+age+".";
		
	}
}

这篇关于Java序列化与反序列化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!