序列化继承

我会带着你远行 2022-04-24 10:50 288阅读 0赞

相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;但是该对象也要实现序列化接口
d)并非所有的对象都可以序列化,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。

  1. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。
  2. 这些字段用transient修饰,就不被序列化

当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口

  1. package com.study.demo.serialize;
  2. import lombok.Data;
  3. import lombok.ToString;
  4. import java.io.*;
  5. /**
  6. * Created by e-lipo on 2019/4/23.
  7. */
  8. public class SerializeTest {
  9. public static void main(String[] args) {
  10. PageForm pf = new PageForm();
  11. pf.setPageNum(1);
  12. pf.setPageSize(10);
  13. pf.setUserId("l23");
  14. try {
  15. FileOutputStream fos = new FileOutputStream("e:/serialize.txt");
  16. ObjectOutputStream oos = new ObjectOutputStream(fos);
  17. oos.writeObject(pf);
  18. oos.close();
  19. System.out.println("序列化: " + pf);//序列化: PageForm(super=BaseForm(userId=l23), pageNum=1, pageSize=10)
  20. FileInputStream fis = new FileInputStream("e:/serialize.txt");
  21. ObjectInputStream ois = new ObjectInputStream(fis);
  22. PageForm form = (PageForm)ois.readObject();
  23. System.out.println("反序列化: " + form);//反序列化: PageForm(super=BaseForm(userId=l23), pageNum=1, pageSize=10)
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. //父类实现序列化接口,子类自动序列化
  30. @Data
  31. class BaseForm implements Serializable {
  32. private transient String userId;
  33. }
  34. @Data
  35. @ToString(callSuper = true)
  36. class PageForm extends BaseForm {
  37. private Integer pageNum;
  38. private Integer pageSize;
  39. }

序列化结果
在这里插入图片描述

当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化

但是该对象也要实现序列化接口

  1. package com.study.demo.serialize;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.*;
  6. /**
  7. * Created by e-lipo on 2019/4/23.
  8. */
  9. public class SerializeTest2 {
  10. public static void main(String[] args) {
  11. User user = new User("lipo", new Address("浙江省", "hangzhou"));
  12. try {
  13. FileOutputStream fos = new FileOutputStream("e:/serialize.txt");
  14. ObjectOutputStream oos = new ObjectOutputStream(fos);
  15. oos.writeObject(user);
  16. oos.close();
  17. System.out.println("序列化: " + user);//序列化: User(username=lipo, address=Address(province=浙江省, city=hangzhou))
  18. FileInputStream fis = new FileInputStream("e:/serialize.txt");
  19. ObjectInputStream ois = new ObjectInputStream(fis);
  20. User form = (User)ois.readObject();
  21. ois.close();
  22. System.out.println("反序列化: " + form);//反序列化: User(username=lipo, address=Address(province=浙江省, city=hangzhou))
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. @Data
  29. @AllArgsConstructor
  30. @NoArgsConstructor
  31. class User implements Serializable {
  32. private String username;
  33. private Address address;//类字段也必须实现序列化接口
  34. }
  35. @Data
  36. @AllArgsConstructor
  37. @NoArgsConstructor
  38. class Address implements Serializable {
  39. private String province;
  40. private String city;
  41. }

父类未实现Serializable,子类实现了,序列化子类实例的时候,父类的属性不保存

  1. package com.study.demo.serialize;
  2. import lombok.Data;
  3. import lombok.ToString;
  4. import java.io.*;
  5. /**
  6. * Created by e-lipo on 2019/4/23.
  7. */
  8. public class SerializeTest3 {
  9. public static void main(String[] args) {
  10. Child pf = new Child();
  11. pf.setPageNum(1);
  12. pf.setPageSize(10);
  13. pf.setUserId("l23");
  14. try {
  15. FileOutputStream fos = new FileOutputStream("e:/serialize.txt");
  16. ObjectOutputStream oos = new ObjectOutputStream(fos);
  17. oos.writeObject(pf);
  18. oos.close();
  19. System.out.println("序列化: " + pf);//序列化: Child(super=Parent(userId=l23), pageNum=1, pageSize=10)
  20. FileInputStream fis = new FileInputStream("e:/serialize.txt");
  21. ObjectInputStream ois = new ObjectInputStream(fis);
  22. Child form = (Child)ois.readObject();
  23. System.out.println("反序列化: " + form);//反序列化: Child(super=Parent(userId=null), pageNum=1, pageSize=10)
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. @Data
  30. class Parent{
  31. private String userId;
  32. }
  33. //父类没有实现序列化,子类实现序列化,子类序列化时,父类属性值丢失
  34. @Data
  35. @ToString(callSuper = true)
  36. class Child extends Parent implements Serializable {
  37. private Integer pageNum;
  38. private Integer pageSize;
  39. }

transient关键字修饰的属性不序列化

  1. package com.study.demo.serialize;
  2. import lombok.Data;
  3. import lombok.ToString;
  4. import java.io.*;
  5. /**
  6. * Created by e-lipo on 2019/4/23.
  7. */
  8. public class SerializeTest {
  9. public static void main(String[] args) {
  10. PageForm pf = new PageForm();
  11. pf.setPageNum(1);
  12. pf.setPageSize(10);
  13. pf.setUserId("l23");
  14. try {
  15. FileOutputStream fos = new FileOutputStream("e:/serialize.txt");
  16. ObjectOutputStream oos = new ObjectOutputStream(fos);
  17. oos.writeObject(pf);
  18. oos.close();
  19. System.out.println("序列化: " + pf);//序列化: PageForm(super=BaseForm(userId=l23), pageNum=1, pageSize=10)
  20. FileInputStream fis = new FileInputStream("e:/serialize.txt");
  21. ObjectInputStream ois = new ObjectInputStream(fis);
  22. PageForm form = (PageForm)ois.readObject();
  23. System.out.println("反序列化: " + form);//反序列化: PageForm(super=BaseForm(userId=l23), pageNum=1, pageSize=null)
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. //父类实现序列化接口,子类自动序列化
  30. @Data
  31. class BaseForm implements Serializable {
  32. private String userId;
  33. }
  34. @Data
  35. @ToString(callSuper = true)
  36. class PageForm extends BaseForm {
  37. private Integer pageNum;
  38. private transient Integer pageSize;
  39. }

发表评论

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

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

相关阅读

    相关 Java序列继承

    Java中具有继承的对象序列化 在序列化中,当引入继承时,则根据超类和子类定义了某些情况,这使对每种情况下的序列化的理解变得更加简单。应遵循的基本规则如下。 1.当超类

    相关 序列,反序列

    序列化: 对象的序列化主要有两种用途:   1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;   2) 在网络上传送对象的字节序列。   

    相关 序列继承

    相关注意事项 a)序列化时,只对对象的状态进行保存,而不管对象的方法; b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;