计算机系统应用教程网站

网站首页 > 技术文章 正文

你知道Transient 关键字吗? nastran关键字帮助文档

btikc 2024-10-01 08:15:48 技术文章 13 ℃ 0 评论

在开始之前先了解一个序列化

  •  把对象转换为字节序列的过程称为对象的序列化
  • 把字节序列恢复为对象的过程称为对象的反序列化

对象的序列化主要有两种用途:

  1. 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2. 在网络上传送对象的字节序列。

java中我们的实体类实现Serializable接口,目的就是为了让其可序列化。当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。

关于transient关键字

transient的作用及使用方法,官方解释为:

Variables may be marked transient to indicate that they are not part of the persistent state of an object. 
 翻译:“变量可以标记为瞬态,以指示它们不是对象持久状态的一部分。”

我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

其实有时我们并不想让所有的属性都被序列化,那么此时我就可以使用transient关键字;

以下场景可能能够使用到transient关键字:

1、类中的字段值可以根据其它字段推导出来,如在HashMap中的定义的一下变量,size,modCount是属于业务中的中间变量就没必须去序列化;

2、其它,看具体业务需求吧,哪些字段不想被序列化;

举个例子

import java.io.Serializable;
/**
 * 类功能说明: 三角形
 * 类修改者 创建日期2019/1/20
 * 修改说明
 * <p>Title: Triangle.java</p>
 *
 * @author foreveWQ
 * @version V1.0
 **/
public class Triangle implements Serializable {

 private Integer width;
 private Integer height;
 private transient Integer area;

 public Triangle (Integer width, Integer height){
 this.width = width;
 this.height = height;
 this.area = width * height;
 }

 public void setArea(){
 this.area = this.width * this.height;
 }

 @Override
 public String toString(){
 StringBuffer sb = new StringBuffer(30);
 sb.append("width长度 : ");
 sb.append(this.width);
 sb.append("\nheight高度 : ");
 sb.append(this.height);
 sb.append("\narea面积 : ");
 sb.append(this.area);
 return sb.toString();
 }
}
@Test
public void tranisentExample() throws Exception {

 Triangle triangle = new Triangle(2,3);
 System.out.println("1.初始化对象\n"+triangle);

 ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("triangle"));

 // 转换为流写入对象
 o.writeObject(triangle);
 o.close();

 // 从流读取对象
 ObjectInputStream in = new ObjectInputStream(new FileInputStream("triangle"));

 Triangle rectangle1 = (Triangle)in.readObject();
 System.out.println("2.反序列化后的对象\n"+rectangle1);
 rectangle1.setArea();
 System.out.println("3.恢复成原始对象\n"+rectangle1);
 in.close();
}

结果证明被tranisent修饰的area变量,并没有被序列化

考虑到如果有感兴趣的读者,可以拿代码去测试一下,所以接贴了代码。但是可读性不太好,所以附上idea中的程序,个人觉得看起来舒服点。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表