java中transient关键字学习记录
来源:互联网 发布:itools下载付费软件 编辑:程序博客网 时间:2024/06/04 19:30
一、transient关键字的作用
1、为了数据安全,避免序列化和反序列化。
解释:
当对象被序列化时,被transient关键字修饰的变量不会被序列化到目标文件;
当对象从序列化文件重构对象时(反序列化过程),被transient字段修饰的变量不会被恢复。
2、代码解释:详细解释都在注释上写着
注意:运行main函数时,参数添加方式是:点击Run AS->Run Configurations->Arguments,在 Arguments 的 Program arguments 输入IO文件的路径即可
import java.io.DataInputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import org.slf4j.Logger;import org.slf4j.LoggerFactory;class ClassLib implements Serializable {private static final long serialVersionUID = 78987656781L;// 这个字段如果用做序列化时,必须要加transient的,不然就会报错(java.io.NotSerializableException),因为InputStream没有实现可序列化的接口private transient InputStream is;// 在反序列化时,将无法恢复原来值private transient int majorVer;// 以下两个字段加不加 transient关键字都不会参与序列化和反序列化,因为他是类变量private transient static int minorVer;private static transient final int sf = 110;// 当变量被static修饰后,transient就失效了,这也是上线说的因为类变量的原因,被final修饰是起作用的private final transient Logger log = LoggerFactory.getLogger(ClassLib.class);private static final ClassLib LIB = new ClassLib();public ClassLib() {}ClassLib(InputStream is) throws IOException {System.out.println("ClassLib(InputStream) called");this.is = is;DataInputStream dis;if (is instanceof DataInputStream) {dis = (DataInputStream) is;} else {dis = new DataInputStream(is);}// 这段代码是参数必须是".class"文件,去掉后就没有此限制了// if (dis.readInt() != 0xcafebabe) {// throw new IOException("not a *.class file");// }minorVer = dis.readShort();majorVer = dis.readShort();}int getMajorVer() {return majorVer;}int getMinorVer() {return minorVer;}int getSf() {return sf;}Logger getLog() {return log;}ClassLib getLib() {return LIB;}void showIS() {System.out.println(is);}}public class TransDemo {public static void main(String[] args) throws IOException {if (args.length != 1) {System.err.println("usage: java TransDemo classfile");return;}ClassLib cl = new ClassLib(new FileInputStream(args[0]));// 序列化之前的数据显示System.out.printf("Minor version number: %d%n", cl.getMinorVer());System.out.printf("Major version number: %d%n", cl.getMajorVer());System.out.printf("SF version number: %d%n", cl.getSf());System.out.println("Log " + cl.getLog());System.out.println("Lib " + cl.getLib());cl.showIS();// 开始序列化到 x.ser文件try (FileOutputStream fos = new FileOutputStream("x.ser");ObjectOutputStream oos = new ObjectOutputStream(fos)) {oos.writeObject(cl);}cl = null;// 开始反序列化try (FileInputStream fis = new FileInputStream("x.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) {System.out.println();cl = (ClassLib) ois.readObject();// 输出反序列化的结果System.out.printf("Minor version number: %d%n", cl.getMinorVer());System.out.printf("Major version number: %d%n", cl.getMajorVer());System.out.printf("SF version number: %d%n", cl.getSf());System.out.println("Log " + cl.getLog());System.out.println("Lib " + cl.getLib());cl.showIS();} catch (ClassNotFoundException cnfe) {System.err.println(cnfe.getMessage());}}}
知识来源:http://www.importnew.com/12611.html
知识来源:http://blog.csdn.net/wohyd/article/details/54922842
加入了我个人的理解,如果有错或者别的意见请联系我,一起学习。
阅读全文
0 0
- java中transient关键字学习记录
- java中transient关键字学习记录
- java中transient关键字使用学习
- Java transient关键字学习
- java中transient关键字
- java中transient关键字
- Java----再学习-----transient关键字
- Java transient关键字学习使用
- java中transient关键字简介
- java 中 transient 关键字意义
- java中transient关键字作用
- Java中Transient关键字解释
- Java 中transient 的关键字用法
- java中transient、volatile、strictfp关键字说明
- JAVA中transient关键字的使用
- java中transient关键字的作用
- Java中transient关键字的应用
- 浅谈Java中transient关键字的作用
- 约瑟夫问题,过程推理,递归
- Python入门系列——第5篇
- 第6章 线程的基础知识
- Lua中的pcall,xpcall
- kafka原理简介并且与RabbitMQ的选择
- java中transient关键字学习记录
- libjpeg(1)
- 使用myeclipse部署项目
- C++ 编译时 写入/tmp/xxx时出错,设备上没有空间,编译中断
- 求数组中出现次数超过一半的字符【每日一题】
- 正交投影
- kafka单节点搭建(创建topic让producer为consumer提供消息)
- Oracle 建立索引及SQL优化
- 【js基础】字符串相关函数