1. 概述
对象的序列化与反序列化其实就是将对象的状态保存下来,一般是保存到文件中,但是其实更常用的是将对象的序列化为字符串保存到数据库中,然后在需要读取对象情况的时候反序列化为对象。
2. Serializable接口
可以实行序列化的类需要实现Serializable接口,此处需要注意的是如果某个属性不需要被序列化,可以添加transient关键字,这个用的较少此处也不演示了。
package org.maoge.io; import java.io.Serializable; //Student类用于演示对象的序列化 public class Student implements Serializable{//Student类通过实现Serializable接口拥有了序列化的能力 private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3. 序列化与反序列化方法封装
一般封装为静态方法,需要的时候拿过来用就行,以下是示例:
package org.maoge.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeDemo { //测试入口 public static void main(String[] args) throws Exception{ Student student=new Student(); student.setId("1"); student.setName("王老三"); String serialStr=serializeToString(student); System.out.println(serialStr); Student deserialStudent=(Student) deserializeToObject(serialStr); System.out.println(deserialStudent.getName());//输出王老三 } //序列化 public static String serializeToString(Object obj) throws Exception{ ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream objOut = new ObjectOutputStream(byteOut); objOut.writeObject(obj); String str = byteOut.toString("ISO-8859-1");//此处只能是ISO-8859-1,但是不会影响中文使用 return str; } //反序列化 public static Object deserializeToObject(String str) throws Exception{ ByteArrayInputStream byteIn = new ByteArrayInputStream(str.getBytes("ISO-8859-1")); ObjectInputStream objIn = new ObjectInputStream(byteIn); Object obj =objIn.readObject(); return obj; } }