See You Again

浅谈Java序列化

新手在接触到‘序列化’这个概念时可能有点云里雾里,在Java中这个概念提的尤其多。简单的说就是把内存对象持久化成字节流,便于保存到文件、数据库中,也方便在网络上传输。对象序列化机制(object serialization)是Java内建的一种对象持久化方式,可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。本文通过一些代码实践来帮助快速理解序列化。

实践

首先还是实现一个 Person 类,只需要继承Serializable接口即可(表明该类可以被序列化):

  1. import java.io.Serializable;
  2. public class Person implements Serializable {
  3. private String name;
  4. private int id;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getIdx() {
  12. return id;
  13. }
  14. public void setIdx(int id) {
  15. this.id = id;
  16. }
  17. }

然后新建一个 Person 对象,将其序列化到文件ser.dat里,并从此文件里恢复对象,以模拟在网络上的数据传输:

  1. import java.io.*;
  2. public class SerializableDemo {
  3. public static void main(String[] args) {
  4. Person person = new Person();
  5. person.setName("shaw");
  6. person.setIdx(15);
  7. ObjectOutputStream oos = null;
  8. ObjectInputStream ois = null;
  9. try {
  10. oos = new ObjectOutputStream(new FileOutputStream("ser.dat"));
  11. oos.writeObject(person);
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. try {
  16. ois = new ObjectInputStream(new FileInputStream("ser.dat"));
  17. Person newPerson = (Person) ois.readObject();
  18. System.out.println(newPerson.getName() + newPerson.getIdx());
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

打开序列化后的二进制字节流,可以看到内容:

可以看出,Java序列化后的数据包含了不少信息:

可以看出,Java序列化后包含了对象的很多信息,因此占用了较大的空间,实际有 71字节,而在上一节用 GPB协议传递同样的数据只需要 8字节,使用JSON只有23字节,因此不建议直接在网络传输。另外还有序列化安全性问题、前后兼容性问题等。更建议通过JSON去做:

  1. import com.google.gson.Gson;
  2. Gson gson = new Gson();
  3. System.out.println(gson.toJson(person));
  4. Person gsonPerson = gson.fromJson("{\"name\":\"shaw\",\"id\":15}", Person.class);

参考

2016-08-09 喜欢

Copyright © 2015-2018 转载请注明出处

回到顶部 ↑