网站首页 > 技术文章 正文
在开始之前先了解一个序列化
- 把对象转换为字节序列的过程称为对象的序列化。
- 把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
- 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
- 在网络上传送对象的字节序列。
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中的程序,个人觉得看起来舒服点。
猜你喜欢
- 2024-10-01 3W 字详解 Java 集合 3w+字详解+java+集合使用
- 2024-10-01 一次线上故障:数据库连接池泄露后的思考
- 2024-10-01 听说这四个概念,很多Java老手都说不清,你能分得清么?
- 2024-10-01 JPA Transient示例 jpa truncate
- 2024-10-01 Java序列化和反序列化 java序列化和反序列化错误的是
- 2024-10-01 12张图带你彻底理解Java中的各种锁
- 2024-10-01 Java 从入门到放弃(二):修饰符 java中的修饰符有哪些?
- 2024-10-01 你真的以为你了解Java的序列化了吗?
- 2024-10-01 字节码混淆:实现Java字节码加密的实战解析
- 2024-10-01 被遗忘的Java关键字:transient! java synchronized关键字
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)