序列化

序列化就是将一个对象转换成字节序列,方便存储和传输。

  • 序列化:ObjectOutputStream.writeObject()
  • 反序列化:ObjectInputStream.readObject()

不会对静态变量进行序列化,因为序列化只是保存对象的状态静态变量属于类的状态

Serializable

序列化的类需要实现 Serializable 接口,它只是一个标准,
没有任何方法需要实现,但是如果不去实现它的话而进行序列化,会抛出异常。

  1. /**
  2. * 序列化就是将一个对象转换成字节序列,方便存储和传输。
  3. - 序列化:ObjectOutputStream.writeObject()
  4. - 反序列化:ObjectInputStream.readObject()
  5. */
  6. public class SerializableDemo {
  7. public static void main(String[] args) throws IOException, ClassNotFoundException {
  8. String objectFile="demo6.txt";
  9. //序列化
  10. serialize(objectFile);
  11. //反序列化
  12. deserialize(objectFile);
  13. }
  14. //序列化
  15. public static void serialize(String objectFile) throws IOException {
  16. A a=new A(1,"aaa");
  17. ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(objectFile));
  18. //序列化
  19. objectOutputStream.writeObject(a);
  20. objectOutputStream.close();
  21. }
  22. //反序列化
  23. public static void deserialize(String objectFile) throws IOException, ClassNotFoundException {
  24. ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(objectFile));
  25. A a2=(A)objectInputStream.readObject();
  26. System.out.println(a2);
  27. objectInputStream.close();
  28. }
  29. private static class A implements Serializable {
  30. private int x;
  31. private String y;
  32. A(int x, String y) {
  33. this.x = x;
  34. this.y = y;
  35. }
  36. @Override
  37. public String toString() {
  38. return "x = " + x + " " + "y = " + y;
  39. }
  40. }
  41. }

输出结果:

  1. x = 1 y = aaa

transient

transient 关键字可以使一些属性不会被序列化。

ArrayList 中存储数据的数组 elementData 是用 transient 修饰的,因为这个数组是动态扩展的,并不是所有的空间都被使用,因此就不需要所有的内容都被序列化。通过重写序列化和反序列化方法,使得可以只序列化数组中有内容的那部分数据。

  1. private static class A implements Serializable {
  2. private int x;
  3. private transient String y; //transient 关键字可以使一些属性不会被序列化。
  4. A(int x, String y) {
  5. this.x = x;
  6. this.y = y;
  7. }
  8. @Override
  9. public String toString() {
  10. return "x = " + x + " " + "y = " + y;
  11. }
  12. }

输出结果:

  1. x = 1 y = null