- 浏览: 4382822 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (163)
- 职场 && 心情 (22)
- Java/Basic (17)
- Java/Compression (7)
- Java/Security (20)
- Java/Maven (3)
- Java/Cache (11)
- Eclipse (4)
- Spring (19)
- ORM/Hibernate (2)
- ORM/iBatis (3)
- DB/NoSQL (11)
- DB/MySQL (7)
- DB/MS SQL Server (4)
- OS/Linux (11)
- OS/Mac (7)
- C/C++ (4)
- Server Architecture/Basic (13)
- Server Architecture/Distributed (17)
- Moblie/Andriod (2)
- WebService (3)
- Objective-C (1)
- Html (1)
- 设计模式 (1)
- Scala (0)
- Kafka (1)
最新评论
-
w47_csdn:
证书安装:在"浏览"选项中选择" ...
Java加密技术(九)——初探SSL -
w47_csdn:
spiritfrog 写道你好,我按照你的步骤,tomcat中 ...
Java加密技术(九)——初探SSL -
liuyachao111:
11楼说的对 用@ControllerAdvicepublic ...
Spring 注解学习手札(八)补遗——@ExceptionHandler -
irayslu:
作者你好, 我把你的源码放在jdk6, jdk7 中运行正常, ...
Java加密技术(五)——非对称加密算法的由来DH -
夏季浅忆-卖小子:
为什么不能解压rar格式的压缩包呢
Java压缩技术(三) ZIP解压缩——Java原生实现
眼看就要2012了,这一年给自己树立的研究课题基本上因为工作的转型,最终都没能实现。开发经验开始消减,更没能赶上新技术。终于,我要恢复开发经验! 找回曾经的我!
最近被问到很多Java基础性的问题,突然发现自己长时间沉迷于框架整合的乐趣中,有关于底层这方面原来不曾深度研究,有必要恶补下了。
“transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”?
打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。
定义People
密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。
为了代码简洁,未将流操作至于try-catch中,仅为演示,勿仿!
执行操作:
密码字段为null,反序列化时根本没有从文件中获取到信息。
这个变量类型,理解起来都不费事,但就是适用场景,我一直纠结。
暂时整理如下,欢迎拍砖补充!
适用场景:
1.不打算序列化某字段的值,节省空间
2.传递序列化流的时候,不传递该值等
如上信息似乎跟JNI有关,欢迎拍砖!
我看java许多源码都用到了呐。
为了代码简洁,我抛开了try-catch.
网络密文交互要比这个复杂,有安全强度要求。如想了解可以参考我的加密解密系列帖子。
别我用一个password字段,把大家引导沟里去了。
比如说用transient定义一个int变量,用做计数,序列化/反序列化后必须重新核算。这个意义就比较明显。对于这个瞬时变量不需要存储,只需要在内存中重新核算。期待继续拍砖!!拍出个金豆子!
这个“挥发态”跟序列化没关系,跟线程安全有关。我需要研究下如何模拟测试。。。
据说它比synchronized效率更高!
这个“挥发态”跟序列化没关系,跟线程安全有关。我需要研究下如何模拟测试。。。
最近被问到很多Java基础性的问题,突然发现自己长时间沉迷于框架整合的乐趣中,有关于底层这方面原来不曾深度研究,有必要恶补下了。
“transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”?
打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。
定义People
public class People implements Serializable { private static final long serialVersionUID = 8294180014912103005L; /** * 用户名 */ private String username; /** * 密码 */ private transient String password; }
密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。
为了代码简洁,未将流操作至于try-catch中,仅为演示,勿仿!
public static void main(String[] args) throws Exception { People p = new People(); p.setUsername("snowolf"); p.setPassword("123456"); System.err.println("------操作前------"); System.err.println("username: " + p.getUsername()); System.err.println("password: " + p.getPassword()); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream( "people.txt")); oos.writeObject(p); oos.flush(); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "people.txt")); p = (People) ois.readObject(); ois.close(); System.err.println("------操作后------"); System.err.println("username: " + p.getUsername()); System.err.println("password: " + p.getPassword()); }
执行操作:
引用
------操作前------
username: snowolf
password: 123456
------操作后------
username: snowolf
password: null
username: snowolf
password: 123456
------操作后------
username: snowolf
password: null
密码字段为null,反序列化时根本没有从文件中获取到信息。
这个变量类型,理解起来都不费事,但就是适用场景,我一直纠结。
暂时整理如下,欢迎拍砖补充!
适用场景:
1.不打算序列化某字段的值,节省空间
2.传递序列化流的时候,不传递该值等
如上信息似乎跟JNI有关,欢迎拍砖!
评论
10 楼
ifox
2013-07-23
phrmgb 写道
学习了,这些东东有时感觉很偏的,但是特殊的业务用到这些知识
我看java许多源码都用到了呐。
9 楼
wushipan_easy
2011-12-30
收藏一下,以后慢慢看
8 楼
PV_love
2011-12-30
楼主写了
“为了代码简洁,未将流操作至于try-catch中,仅为演示,勿仿!”我没看到。
“比如说用transient定义一个int变量,用做计数,序列化/反序列化后必须重新核算。”
int变量不想写入流中,又得保证序列化前后一致,那之后就得再算一遍int变量的值,要不然有什么好办法么?
“为了代码简洁,未将流操作至于try-catch中,仅为演示,勿仿!”我没看到。
“比如说用transient定义一个int变量,用做计数,序列化/反序列化后必须重新核算。”
int变量不想写入流中,又得保证序列化前后一致,那之后就得再算一遍int变量的值,要不然有什么好办法么?
7 楼
snowolf
2011-12-30
PV_love 写道
1.楼主的代码中,有关文件的操作应该放入try catch 中..
2.transient标识变量的作用是序列化的时候跳过该变量,主要应用的场景应该对象型的变量。
例如
class Hair{
private hairLength;
public Hair(int length){hairLength=length}
}
class body implements Serializable{
private Hair hair;
....
}
hair是body的成员变量,要保存body的时候需要保存hair,这就需要hair是序列化的,但是由于某些原因hair不是序列化的,那么就需要将hair标识成transient,序列化的时候跳过hair,但是可以将表示hair的状态,例如本例中的hairLength保存在流之中,然后在反序列化的时候,将hair变量通过hairLength重新生成,虽然没有保存hair本身,但是保存了表示hair的变量hairLength
我还没试过楼主的那种用法,用transient标识string型的变量,不知道这样可以可以。
如果可以,像这样的保存密码,反序列化的时候如何获得原来的密码呢?
安全方面的知识我不是很了解,我猜可能是将密码md5加密之后在再进行序列化,虽然理论上任何密码都是可以被破解的,但是网络上传输的密码都是这种方式吧?
2.transient标识变量的作用是序列化的时候跳过该变量,主要应用的场景应该对象型的变量。
例如
class Hair{
private hairLength;
public Hair(int length){hairLength=length}
}
class body implements Serializable{
private Hair hair;
....
}
hair是body的成员变量,要保存body的时候需要保存hair,这就需要hair是序列化的,但是由于某些原因hair不是序列化的,那么就需要将hair标识成transient,序列化的时候跳过hair,但是可以将表示hair的状态,例如本例中的hairLength保存在流之中,然后在反序列化的时候,将hair变量通过hairLength重新生成,虽然没有保存hair本身,但是保存了表示hair的变量hairLength
我还没试过楼主的那种用法,用transient标识string型的变量,不知道这样可以可以。
如果可以,像这样的保存密码,反序列化的时候如何获得原来的密码呢?
安全方面的知识我不是很了解,我猜可能是将密码md5加密之后在再进行序列化,虽然理论上任何密码都是可以被破解的,但是网络上传输的密码都是这种方式吧?
为了代码简洁,我抛开了try-catch.
网络密文交互要比这个复杂,有安全强度要求。如想了解可以参考我的加密解密系列帖子。
别我用一个password字段,把大家引导沟里去了。
比如说用transient定义一个int变量,用做计数,序列化/反序列化后必须重新核算。这个意义就比较明显。对于这个瞬时变量不需要存储,只需要在内存中重新核算。期待继续拍砖!!拍出个金豆子!
6 楼
PV_love
2011-12-30
1.楼主的代码中,有关文件的操作应该放入try catch 中..
2.transient标识变量的作用是序列化的时候跳过该变量,主要应用的场景应该对象型的变量。
例如
class Hair{
private hairLength;
public Hair(int length){hairLength=length}
}
class body implements Serializable{
private Hair hair;
....
}
hair是body的成员变量,要保存body的时候需要保存hair,这就需要hair是序列化的,但是由于某些原因hair不是序列化的,那么就需要将hair标识成transient,序列化的时候跳过hair,但是可以将表示hair的状态,例如本例中的hairLength保存在流之中,然后在反序列化的时候,将hair变量通过hairLength重新生成,虽然没有保存hair本身,但是保存了表示hair的变量hairLength
我还没试过楼主的那种用法,用transient标识string型的变量,不知道这样可以可以。
如果可以,像这样的保存密码,反序列化的时候如何获得原来的密码呢?
安全方面的知识我不是很了解,我猜可能是将密码md5加密之后在再进行序列化,虽然理论上任何密码都是可以被破解的,但是网络上传输的密码都是这种方式吧?
2.transient标识变量的作用是序列化的时候跳过该变量,主要应用的场景应该对象型的变量。
例如
class Hair{
private hairLength;
public Hair(int length){hairLength=length}
}
class body implements Serializable{
private Hair hair;
....
}
hair是body的成员变量,要保存body的时候需要保存hair,这就需要hair是序列化的,但是由于某些原因hair不是序列化的,那么就需要将hair标识成transient,序列化的时候跳过hair,但是可以将表示hair的状态,例如本例中的hairLength保存在流之中,然后在反序列化的时候,将hair变量通过hairLength重新生成,虽然没有保存hair本身,但是保存了表示hair的变量hairLength
我还没试过楼主的那种用法,用transient标识string型的变量,不知道这样可以可以。
如果可以,像这样的保存密码,反序列化的时候如何获得原来的密码呢?
安全方面的知识我不是很了解,我猜可能是将密码md5加密之后在再进行序列化,虽然理论上任何密码都是可以被破解的,但是网络上传输的密码都是这种方式吧?
5 楼
沙舟狼客
2011-12-30
transient,这个关键字用的不多
4 楼
phrmgb
2011-12-29
学习了,这些东东有时感觉很偏的,但是特殊的业务用到这些知识
3 楼
snowolf
2011-12-29
snowolf 写道
jyjava 写道
lz,你顺便讲讲volatile呀
这个“挥发态”跟序列化没关系,跟线程安全有关。我需要研究下如何模拟测试。。。
据说它比synchronized效率更高!
2 楼
snowolf
2011-12-29
jyjava 写道
lz,你顺便讲讲volatile呀
这个“挥发态”跟序列化没关系,跟线程安全有关。我需要研究下如何模拟测试。。。
1 楼
jyjava
2011-12-29
lz,你顺便讲讲volatile呀
发表评论
-
DisplayTag POI支持——Excel文件导出中文乱码问题&包依赖问题-解决
2012-09-29 15:11 7004DisplayTag,可能大部分人都用过,也知道他非常的方便。 ... -
Mountain Lion 升级后Java不可用问题补救
2012-07-31 08:10 7928升级到Mountain Lion后,让我最头痛的是原来的jdk ... -
征服 Kestrel + XMemcached
2012-07-24 12:06 4679接上一篇 征服Kestrel,介绍XMemcached对于Ke ... -
征服 Kestrel
2012-07-23 18:33 13247因为要面对高并发PUSH需求,考虑将其按队列方式实现,最终选型 ... -
Java操作Excel文件导入
2012-06-27 17:33 65075用Excel作为数据源,通过Java Web进行导入,需要PO ... -
JVM学习笔记——内存跟踪
2012-04-12 10:35 0引用 jmap Usage: jmap [optio ... -
BoneCP、DBCP、C3P0、Proxool连接池比较
2012-02-29 13:20 0Proxool关键参数imultaneousBuildTh ... -
JVM学习笔记
2012-02-21 11:48 0以前写代码的时候,从 ... -
Ehcache简单应用——RSSReaderTag
2010-08-04 15:00 3320关于缓存,关于自己运用,大部分情况是通过ORM配置生效。基本上 ... -
基于Web应用的海量数据存储思考
2010-07-30 15:03 0今天讨论很多有关于基 ... -
昨日困惑——Tomcat之应用不能启动!
2010-07-29 10:23 11593昨天下午,我一直在调试程序,由于本地环境等等局限性问题,我只能 ... -
正则表达式
2010-06-30 11:32 0用来验证email的正则 \w+\.?\w+@\w+(\. ... -
JNDI
2010-06-11 12:31 0package com.netqin.common.dbt ... -
评选你认为最没水准的代码
2010-05-19 11:27 0十分不好意思,我的技术洁癖开始作怪。最近接触一些代码,实在是看 ... -
无符号整型
2010-05-18 14:38 0private static long readUInt(I ... -
数据压缩相关(zlib,bzip2,lzma)
2010-04-13 13:45 0一:下面简单说明如何把zlib加入到MFC程序中,提供内存压缩 ... -
Ant编译无响应问题
2010-01-18 10:38 6318前些日子因为要搞自动编译需要用到Ant执行相关操作。Ant以前 ... -
基本数据类型进制转换
2010-01-15 10:49 4363已经很久没有写博客了,已经有很多人不止一次的反问我:“你怎么不 ... -
webservice 常用网址
2009-12-20 21:52 0<p><p>下面总结了一些常用的Web ... -
计算时间
2009-12-02 17:29 0public static int betweenDays ...
相关推荐
关于Java中关键字transient和串行化的简略介绍
java关键字transient
Java中的transient关键字
JAVA中transient关键字的讲解
传热学小案列,一维非稳态传热分析,推荐大家学习
主要和大家说一说java关键字final和transient,感兴趣的小伙伴们可以参考一下
NULL 博文链接:https://jackyz548.iteye.com/blog/1662257
本篇文章序列化、反序列化用的类是同一个类,可以通过注释main中1然后修改Stu类实现有无transient关键字修饰、serialVersionUID是否不同,得到以下结果: 1、serialVersionUID的数值大小不会影响序列化后的字节数...
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,
本文章向大家介绍Java transient关键字的使用方法和实例,包括的知识点有transient的作用、transient使用小结、transient使用细节,需要的朋友可以参考一下
主要介绍了java中transient关键字用法,以实例形式分析了java中transient关键字的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
主要介绍了Java中的transient关键字介绍,需要的朋友可以参考下
主要介绍了Java transient关键字原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
哎,虽然自己熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,做笔试题时发现有一题是关于这个的,于是花个时间整理下transient关键字的使用,涨下姿势~~~...
Java关键字transient 博客地址:https://blog.csdn.net/qq_36963950/article/details/107733719
主要介绍了Java transient 关键字是干啥的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了Java transient关键字与序列化操作,结合实例形式详细分析了java序列化操作相关实现方法与操作注意事项,需要的朋友可以参考下
abstract - 1 - boolean - 2 - break - 2 - byte - 2 - case - 3 - catch - 3 - char - 4 - class - 4 - continue - 5 - ...transient - 17 - try - 17 - true - 18 - void - 18 - volatile - 18 - while - 18 -