Java transient关键字使用小结

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

如下面的例子

package com.kkoolerter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;

public class Main implements Serializable {

private static final long serialVersionUID = -5836283489677344417L;
    private transient int classValue = 10;
    private transient Date date = new Date();
    private transient static int staticValue = 10;

public static void main(String[] args) throws Exception {
        Main m = new Main();
        m.classValue = 11;
        Main.staticValue = 11;
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
                new File("0xjh000")));
        out.writeObject(m);

out.close();

ObjectInputStream in = new ObjectInputStream(new FileInputStream(
                new File("0xjh000")));
        Main m1 = (Main) in.readObject();
        in.close();

System.out.println(m1.classValue);
        System.out.println((m1.date == null ? "date is null"
                : "date is not null"));
    }

}

程序将输出:
0
date is null

这就说明了一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。

思考一下下面的例子:
package com.kkoolerter;

import java.io.Externalizable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class ExternalizableTest implements Externalizable {

private transient String content = "哈哈~我将会被序列化,不管我是是否被transient关键字修饰";

@Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(content);
    }

@Override
    public void readExternal(ObjectInput in) throws IOException,
            ClassNotFoundException {
        content = (String) in.readObject();
    }

public static void main(String[] args) throws Exception {
        ExternalizableTest et = new ExternalizableTest();
        ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
                new File("ext0000")));
        out.writeObject(et);

ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
                "ext0000")));
        ExternalizableTest et1 = (ExternalizableTest) in.readObject();
        System.out.println(et1.content);

out.close();
        in.close();
    }
}

程序运行后将输出如下结果:
哈哈~我将会被序列化,不管我是是否被transient关键字修饰

这是为什么呢,不是说类的变量被transient关键字修饰以后将不能序列化了吗?
我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若操作的是一个Serializable对象,则所有的序列化将会自动进行,若操作的是 一个Externalizable对象,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。

转自:http://www.cnblogs.com/liuling/archive/2013/05/05/transient.html

转载于:https://www.cnblogs.com/yanLog/p/7567263.html

transient、Externalizable相关推荐

  1. Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释...

    转自Hibernate JPA中@Transient.@JsonIgnoreProperties.@JsonIgnore.@JsonFormat.@JsonSerialize等注解解释 1.@Tran ...

  2. Hibernate三种状态(Transient、Persistent、Detached)各种保存(save,persist,update,saveOrUpdte,merge,flush,lock)区别

    转载地址:http://www.2cto.com/kf/201212/178604.html 一.三种状态(Transient.Persistent.Detached) 在Hibernate中有三种状 ...

  3. Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.@Transient @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将 ...

  4. java 反射 transient_JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)...

    transient(瞬时)关键字 当我们队序列化进行控制时,可能某个特定子对象不想让Java的序列化机制自动保存与恢复.如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常就会面临这种情况 ...

  5. Java 序列化 transient 、session、cookie

    transient使用小结 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变 ...

  6. java serializable用法_JAVA序列化Serializable及Externalizable区别详解

    序列化简介 Java 的对象序列化将那些实现 Serializable 接口的对象转换成一个字节序列,并能在之后将这个字节序列完全恢复为原来的对象. 这就意味着 Java 对象在网络上的传输可以不依赖 ...

  7. java transient关键字_嗯?你真的会用 Java 序列化机制?

    码农每日一题长按关注,工作日每天分享一个技术知识点. 一.序列化.反序列化概念及其使用场景 1.序列化.反序列化的概念 简单的讲,序列化就是将java对象转化成二进制保存到磁盘中去,反序列化就是从磁盘 ...

  8. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  9. 【已完结!】Java基础--学习笔记(零起点打开java世界的大门)--博客汇总表【附:视频、工程源码、资料、详细笔记】

    java零基础入门到精通(2019版)[黑马程序员] 视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:z ...

最新文章

  1. 中台辨析:架构的演进趋势
  2. First day in 聚美
  3. redis 主从配置_应用 | Redis实现 主从,单例,集群,哨兵,配置应用
  4. SAP在物流工作中的应用之学习笔记
  5. 神策数据 App 可视化全埋点 2.0 重磅升级!抢先体验
  6. Luogu P4708 画画 (Burnside引理、组合计数)
  7. 通过此注释改善您的JUnit体验
  8. [转]迭代、集合、字典表和列表
  9. RTX5 | 线程管理02 - 创建线程(动态堆栈方式)
  10. SqlServer数据库的常用操作-更新中
  11. easyui input输入框的限制和校验条件
  12. ARM处理器指定运行核
  13. python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径
  14. 指令级并行——超标量Superscalar与超长指令字VLIW架构
  15. 解密深圳IT人士的当前薪情【转自:中国it实验室】
  16. PyCharm怎么来更新pip
  17. 计算机右键管理是什么软件,右键管理工具打不开怎么办【图文】
  18. 快圣诞节了,用Python 送你一棵圣诞树
  19. 笔试加分题:有16瓶水,其中只有一瓶水有毒,小白鼠喝一滴之后一小时会死。请问最少用() 只小白鼠,在1小时内一定可以找出有毒的水?
  20. “Think Different”是个糟糕的想法

热门文章

  1. UVA - 699 The Falling Leaves
  2. [leetcode]240. 搜索二维矩阵 II
  3. Unity3D基础7:Transform组件
  4. HDU 6184 2017广西邀请赛:Counting Stars(三元环)
  5. matlab 求二值图像图形的面积和重心
  6. gRPC传输协议使用(python教程)
  7. python机器学习库sklearn——多类、多标签、多输出
  8. js中DOM, DOCUMENT, BOM, WINDOW 区别
  9. matlab2c使用c++实现matlab函数系列教程-randn函数
  10. c#图像处理-图像预览全解