序列化和反序列化(三)——父类的序列化

迷南。 2022-02-15 13:50 444阅读 0赞

1、一个父类实现序列化,子类自动实现序列化;

  1. 示例:
  2. package com.jd.vo;
  3. import java.io.Serializable;
  4. public class Father implements Serializable{
  5. private static final long serialVersionUID = 6614009233928674796L;
  6. public int age;
  7. }
  8. package com.jd.vo;
  9. public class Son extends Father {
  10. private static final long serialVersionUID = -7604257792005206061L;
  11. private String name;
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. }
  19. package com.jd.test;
  20. import java.io.*;
  21. import com.jd.vo.Son;
  22. public class Test {
  23. /**
  24. * 序列化
  25. *
  26. * @author GaoHuanjie
  27. */
  28. public static void serialize() {
  29. Son son = new Son();
  30. son.age = 12;
  31. son.setName("Tom");
  32. System.out.println(son);
  33. ObjectOutput objectOutput = null;
  34. try {
  35. objectOutput = new ObjectOutputStream(new FileOutputStream("D:\\son.ser"));
  36. objectOutput.writeObject(son);
  37. objectOutput.flush();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. } finally {
  41. if (objectOutput != null) {
  42. try {
  43. objectOutput.close();
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }
  49. }
  50. /**
  51. * 反序列化
  52. *
  53. * @author GaoHuanjie
  54. */
  55. public static void deserialize() {
  56. ObjectInput objectInput = null;
  57. try {
  58. objectInput = new ObjectInputStream(new FileInputStream("D:\\son.ser"));
  59. Son son = (Son) objectInput.readObject();
  60. System.out.println(son.age);//输出12 age属性是Son类从Father类继承过来的,由于父类实现Serializable接口,所以序列化子类时age属性也会被序列化。
  61. System.out.println(son.getName());//输出Tom 尽管Son类没有实现Serializable接口,但由于其父类实现了该接口,所以Son类中name属性依然被序列化。
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. } catch (ClassNotFoundException e) {
  65. e.printStackTrace();
  66. } finally {
  67. if (objectInput != null) {
  68. try {
  69. objectInput.close();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. }
  76. public static void main(String[] args) throws Exception {
  77. serialize();// 序列化
  78. deserialize();// 反序列化
  79. }
  80. }

2、子类实现序列化,父类没有实现,则子类继承父类的属性在序列化子类时不会被序列化;

  1. 示例:
  2. package com.jd.vo;
  3. public class Father{
  4. public int age;
  5. }
  6. package com.jd.vo;
  7. import java.io.Serializable;
  8. public class Son extends Father implements Serializable {
  9. private static final long serialVersionUID = -7604257792005206061L;
  10. private String name;
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. }
  18. package com.jd.test;
  19. import java.io.*;
  20. import com.jd.vo.Son;
  21. public class Test {
  22. /**
  23. * 序列化
  24. *
  25. * @author GaoHuanjie
  26. */
  27. public static void serialize() {
  28. Son son = new Son();
  29. son.age = 12;
  30. son.setName("Tom");
  31. System.out.println(son);
  32. ObjectOutput objectOutput = null;
  33. try {
  34. objectOutput = new ObjectOutputStream(new FileOutputStream("D:\\son.ser"));
  35. objectOutput.writeObject(son);
  36. objectOutput.flush();
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. } finally {
  40. if (objectOutput != null) {
  41. try {
  42. objectOutput.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. }
  49. /**
  50. * 反序列化
  51. *
  52. * @author GaoHuanjie
  53. */
  54. public static void deserialize() {
  55. ObjectInput objectInput = null;
  56. try {
  57. objectInput = new ObjectInputStream(new FileInputStream("D:\\son.ser"));
  58. Son son = (Son) objectInput.readObject();
  59. System.out.println(son.age);//age属性是Son类从Father类继承过来的,但由于父类没有实现Serializable接口,所以序列化子类时age属性并不会被序列化。
  60. System.out.println(son.getName());
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. } catch (ClassNotFoundException e) {
  64. e.printStackTrace();
  65. } finally {
  66. if (objectInput != null) {
  67. try {
  68. objectInput.close();
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. }
  74. }
  75. public static void main(String[] args) throws Exception {
  76. serialize();// 序列化
  77. deserialize();// 反序列化
  78. }
  79. }

3、子类实现序列化,父类没有实现,则父类必须提供无参构造方法;

  1. 例子:
  2. package com.jd.vo;
  3. public class Father{
  4. public int age;
  5. public Father() {//该无参构造方法不可省略,否则出现“java.io.InvalidClassException: com.jd.vo.
  6. Son; no valid constructor”异常
  7. }
  8. public Father(int age) {
  9. this.age = age;
  10. }
  11. }
  12. package com.jd.vo;
  13. import java.io.Serializable;
  14. public class Son extends Father implements Serializable{
  15. private static final long serialVersionUID = -7604257792005206061L;
  16. public Son(int age) {
  17. super(age);
  18. this.age = age;
  19. }
  20. private String name;
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. }
  28. package com.jd.test;
  29. import java.io.*;
  30. import com.jd.vo.Son;
  31. public class Test {
  32. public static void main(String[] args) throws Exception {
  33. try {
  34. // 序列化
  35. ObjectOutput objectOutput = new ObjectOutputStream(new FileOutputStream("D:\\son.ser"));
  36. Son son = new Son(12);
  37. son.setName("Tom");
  38. System.out.println(son);
  39. objectOutput.writeObject(son);
  40. objectOutput.flush();
  41. objectOutput.close();
  42. // 反序列化
  43. ObjectInput objectInput = new ObjectInputStream(new FileInputStream("D:\\son.ser"));
  44. son = (Son) objectInput.readObject();
  45. objectInput.close();
  46. System.out.println(son.age);
  47. System.out.println(son.getName());
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }

发表评论

表情:
评论列表 (有 0 条评论,444人围观)

还没有评论,来说两句吧...

相关阅读

    相关 序列序列

      互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同

    相关 序列序列

    序列化和反序列化   摘要   序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没

    相关 序列序列

    个人学习理解 (只是自己默写序列化和反序列的代码以及几个问题) 1.序列化 和 反序列化 1.1 什么是序列化 和 反序列化 或者 你如何理解序列化和

    相关 序列序列

    序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进