對象的序列化與反序列化其實就是將對象的狀態保存下來,一般是保存到文件中,但是其實更常用的是將對象序列化為字符串保存到數據庫中,然后在需要讀取對象的情況下將字符串反序列化為對象。
可以序列化的類必須實現Serializabe接口,此處需要注意的是如果某個屬性不需要被序列化,可以添加transient關鍵字。
下面是一個可以被序列化的類:
package demo1; import java.io.Serializable; public class Person implements Serializable{ private static final long serialVersionUID = 1L; private int id; private String name; private int age; private transient String sex; public Person(int id, String name, int age,String sex) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; } 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return this.id+" "+this.name+" "+this.age+" "+this.sex; } }
下面是封裝序列化的類:
package demo1; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeUtils { public static String serialize(Object obj) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream; objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(obj); String string = byteArrayOutputStream.toString("ISO-8859-1"); objectOutputStream.close(); byteArrayOutputStream.close(); return string; } public static Object serializeToObject(String str) throws IOException, ClassNotFoundException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(str.getBytes("ISO-8859-1")); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); Object object = objectInputStream.readObject(); objectInputStream.close(); byteArrayInputStream.close(); return object; } }
下面是使用redis簡單的將對象序列化后保存到數據庫中然后再從數據庫中取出數據反序列化的過程:
public class DemoAtomic { public static void main(String [] args) throws IOException, ClassNotFoundException { Jedis jedis = new Jedis("localhost",6379); jedis.setex("test1", 60*60*24,SerializeUtils.serialize(new Person(1, "測試1", 21,"男"))); jedis.setex("test2", 60*60*24,SerializeUtils.serialize(new Person(2, "測試2", 21,"女"))); jedis.setex("test3", 60*60*24,SerializeUtils.serialize(new Person(3, "測試3", 21,"男"))); jedis.setex("test4", 60*60*24,SerializeUtils.serialize(new Person(4, "測試4", 21,"女"))); Set<String> keys = jedis.keys("*"); for (String s:keys) { System.out.println(s); Person person = (Person)SerializeUtils.serializeToObject(jedis.get(s)); System.out.println(person.toString()); } } }
下面為打印數據:
test4 4 測試4 21 null test2 2 測試2 21 null test3 3 測試3 21 null test1 1 測試1 21 null