1. 必须实现序列化接口 - 声明UID
  2. 属性私有化,并且声明get/set方法
  3. 声明无参和有参构造函数
  4. 重写hashCode和equals方法
  5. 重写toString方法

拓展:
transient关键字在序列化中的使用:这是一个修饰符,被修饰的属性可以在序列化中被忽略
在某些特定的业务场景会使用

封装一个person类

  1. package Test21_Demo.Demo05;/*
  2. @create 2020--12--14--10:18
  3. */
  4. import java.io.Serializable;
  5. import java.util.Objects;
  6. public class Person_up implements Serializable {
  7. private static final long serialVersionUID = -5779259024239172808L;
  8. //定义的普通表示码 - 普通版本码
  9. //private static final long SerialVersionUID = 1L;
  10. private String name;
  11. //这个age就不会被序列化
  12. private transient int age;
  13. public Person_up() {
  14. }
  15. @Override
  16. public String toString() {
  17. return "Person{" +
  18. "name='" + name + '\'' +
  19. ", age=" + age +
  20. '}';
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public int getAge() {
  29. return age;
  30. }
  31. public void setAge(int age) {
  32. this.age = age;
  33. }
  34. public Person_up(String name, int age) {
  35. super();
  36. this.name = name;
  37. this.age = age;
  38. }
  39. @Override
  40. public boolean equals(Object o) {
  41. if (this == o) return true;
  42. if (!(o instanceof Person_up)) return false;
  43. Person_up personUp = (Person_up) o;
  44. return getAge() == personUp.getAge() &&
  45. Objects.equals(getName(), personUp.getName());
  46. }
  47. @Override
  48. public int hashCode() {
  49. return Objects.hash(getName(), getAge());
  50. }
  51. }

序列化

  1. package Test21_Demo.Demo05;/*
  2. @create 2020--12--14--10:33
  3. */
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectOutputStream;
  7. public class SerializableDemo {
  8. public static void main(String[] args) throws IOException {
  9. //准备被序列化的对象
  10. Person_up person = new Person_up("Jack.Ma", 18);
  11. //进行序列化操作
  12. FileOutputStream fos = new FileOutputStream("person_up.txt");
  13. ObjectOutputStream oos = new ObjectOutputStream(fos);
  14. //开始序列化
  15. oos.writeObject(person);
  16. //关闭流a
  17. oos.close();
  18. }
  19. }

反序列化

  1. package Test21_Demo.Demo05;/*
  2. @create 2020--12--14--10:33
  3. */
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. public class SerializableDemo2 {
  8. public static void main(String[] args) throws IOException, ClassNotFoundException {
  9. //进行反序列化操作
  10. FileInputStream fis = new FileInputStream("person_up.txt");
  11. ObjectInputStream ois = new ObjectInputStream(fis);
  12. //开始反序列化
  13. Person_up person_up = (Person_up) ois.readObject();
  14. System.out.println(person_up.getName() + " " + person_up.getAge());//Jack.Ma 0
  15. System.out.println(person_up);//Person{name='Jack.Ma', age=0}
  16. //关闭流
  17. ois.close();
  18. }
  19. }