目录
知识点
代码(伪)
代码(全)
序列化:
百度:序列化 (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+"."; } }