serializable和transient关键字作用

一、序列化使用场景

对象的序列化:目的:将一个具体的对象进行持久化,写入到硬盘上。(注意:静态数据不能被序列化,因为静态数据不在堆内存中,而是在静态方法区中)

Serializable用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。

二、非序列化使用场景

如何将非静态的数据不进行序列化?用transient 关键字修饰此变量即可。使用场景:为了安全起见,有时候我们不需要在网络间
传输一些数据(如身份证号码,密码,银行卡号等)

三、代码体现

  1. package com.wanghang.one;
  2. import java.io.Serializable;
  3. /**
  4. * 序列化与非序列化
  5. *
  6. * @author Hang.W
  7. * @version 1.0, 2017-02-10 01:30:12
  8. */
  9. class Person implements Serializable {
  10. // UID
  11. private static final long serialVersionUID = 42L;
  12. // 用transient修饰后name将不会进行序列化
  13. private transient String name;
  14. public int age;
  15. Person(String name, int age) {
  16. this.name = name;
  17. this.age = age;
  18. }
  19. @Override
  20. public String toString() {
  21. return "Person [name=" + name + ", age=" + age + "]";
  22. }
  23. }

四、transient关键字注意事项

1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。
2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
3、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。

猜你喜欢

转载自blog.csdn.net/belalds/article/details/80847861
今日推荐