Java transient关键字使用小记

3. transient使用细节——被transient关键字修饰的变量真的不能被序列化吗?

  思考下面的例子:


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;

/**

* @descripiton Externalizable接口的使用

*

* @author Alexia

* @date 2013-10-15

*

*/

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("test")));

out.writeObject(et);

ObjectInput in = new ObjectInputStream(new FileInputStream(new File(

"test")));

et = (ExternalizableTest) in.readObject();

System.out.println(et.content);

out.close();

in.close();

}

}

  content变量会被序列化吗?好吧,我把答案都输出来了,是的,运行结果就是:

  是的,我将会被序列化,不管我是否被transient关键字修饰

  这是为什么呢,不是说类的变量被transient关键字修饰以后将不能序列化了吗?

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

 3. transient使用细节——被transient关键字修饰的变量真的不能被序列化吗?

  思考下面的例子:


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;

/**

* @descripiton Externalizable接口的使用

*

* @author Alexia

* @date 2013-10-15

*

*/

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("test")));

out.writeObject(et);

ObjectInput in = new ObjectInputStream(new FileInputStream(new File(

"test")));

et = (ExternalizableTest) in.readObject();

System.out.println(et.content);

out.close();

in.close();

}

}

  content变量会被序列化吗?好吧,我把答案都输出来了,是的,运行结果就是:

  是的,我将会被序列化,不管我是否被transient关键字修饰

  这是为什么呢,不是说类的变量被transient关键字修饰以后将不能序列化了吗?

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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-12-31 09:00:31

Java transient关键字使用小记的相关文章

Java transient关键字使用小记_java

哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transient关键字的使用,涨下姿势~~~好了,废话不多说,下面开始: 1. transient的作用及使用方法        我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了S

Java transient 关键字详解及实例代码_java

Java transient 关键字 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化. 然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见

Java transient关键字使用小结

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

java中transient关键字用法分析_java

本文实例分析了java中transient关键字用法.分享给大家供大家参考.具体分析如下: java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身.这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后

Java中的transient关键字介绍_java

transient说明一个属性是临时的,不会被序列化. 下面是一个Demo,name声明为 transient,不被序列化 package com.zzs.tet; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.

Java序列化——transient关键字和Externalizable接口

    提到Java序列化,相信大家都不陌生.我们在序列化的时候,需要将被序列化的类实现Serializable接口,这样的类在序列化时,会默认将所有的字段都序列化.那么当我们在序列化Java对象时,如果不希望对象中某些字段被序列化(如密码字段),怎么实现呢?看一个例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import java.io.Serializable; import java.util

transient关键字使用笔记

1.transient的作用及使用方法 一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化. 在实际开发过程中,有时候会遇到这样的情况: 一个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓

Java的关键字与保留字小结_java

Java 关键字列表 (依字母排序 共51组): abstract, assert,boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum,extends, final, finally, float, for, if, implements, import, instanceof, int, interface, long, native, new, pac

谈Java static关键字的用法与好处_java

本文针对Java static关键字的使用方法进行汇总,供大家参考,具体内容如下 1.对于static关键字的使用的时候对于修饰变量的时候,它相当于一个全局变量: 2.对于static修饰一个函数的时候他是在类被加载的时候首先会被类加载,并且只能加载一次,并且这个方法可以不需要通过实例进行调用例如: mystatic.java package study; public class mystatic { public static int sta=0; public int st=0; //st