Transient修饰符的使用

如果一个类没有继承Serilizable接口,那么它就不能被序列化,写入文件的时候会报异常。如果一个类继承了Serilizable接口,那么这个类的所有属性和方法都可以自动被序列化,而现实中我们又希望继承Serilizable的这个类的某些属性不被序列化保存该需要怎么做呢?这时就需要Transient修饰符上场了。总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

 1 public class TransientTest {
 2
 3     public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{
 4         User user = new User("hoojjack", "123456");
 5         System.out.println("name="+user.getName());
 6         System.out.println("password="+user.getPassword());
 7         System.out.println("sex="+User.getSex());
 8         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:\\Users\\joey\\Desktop\\user.txt"));
 9         out.writeObject(user);
10         out.flush();
11         out.close();
12         User.setSex("girl");
13         ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:\\Users\\joey\\Desktop\\user.txt"));
14         User u=(User)in.readObject();
15         in.close();
16         System.out.println("After  name="+u.getName()+" password="+u.getPassword()+" sex="+User.getSex());
17     }
18
19 }
20
21 class User implements Serializable{
22     private static final long serialVersionUID = 1L;
23     private String name;
24     private transient String password;
25     private static transient String sex="boy";
26     //private static  String sex="boy";
27
28     public static String getSex() {
29         return sex;
30     }
31
32
33     public static void setSex(String sex) {
34         User.sex = sex;
35     }
36
37
38     public User(String name, String password) {
39         this.name = name;
40         this.password = password;
41     }
42
43
44     public String getName() {
45         return name;
46     }
47
48     public void setName(String name) {
49         this.name = name;
50     }
51
52     public String getPassword() {
53         return password;
54     }
55
56     public void setPassword(String password) {
57         this.password = password;
58     }
59 }

结果如下:
1 name=hoojjack
2 password=123456
3 sex=boy
4 After  name=hoojjack password=null sex=girl

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

2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。

3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。如上面代码上的sex属性,即使加不加Transient修饰,结果都是一样的。

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

在Exteralizable类中完全不一样,不管类继承了Serilizable还是被transient修饰的属性,如果没有显示的在exteralWrite中被写入,都不能序列化,请看下面代码:

 1 public class ExternalizableTest implements Externalizable {
 2
 3     private transient String name;
 4     private String sex;
 5
 6     public String getSex() {
 7         return sex;
 8     }
 9
10     public void setSex(String sex) {
11         this.sex = sex;
12     }
13
14     public String getName() {
15         return name;
16     }
17
18     public void setName(String name) {
19         this.name = name;
20     }
21
22     public void writeExternal(ObjectOutput out) throws IOException {
23         out.writeObject(name);
24         //out.writeObject(sex);
25
26     }
27
28     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
29          name = (String)in.readObject();
30         // sex = (String) in.readObject();
31
32     }
33
34     public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException{
35         ExternalizableTest test = new ExternalizableTest();
36         test.setName("hoojjack");
37         test.setSex("boy");
38         ObjectOutput o = new ObjectOutputStream(new FileOutputStream("C:\\Users\\joey\\Desktop\\user.txt"));
39         o.writeObject(test);
40         ObjectInput in = new ObjectInputStream(new FileInputStream("C:\\Users\\joey\\Desktop\\user.txt"));
41         ExternalizableTest context = (ExternalizableTest)in.readObject();
42         System.out.println("name="+context.getName()+" sex="+context.getSex());
43
44     }
45
46 }

输出结果:

1 name=hoojjack sex=null

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

Reference:

[1] http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

时间: 2024-10-14 18:54:20

Transient修饰符的使用的相关文章

java修饰符——transient

一.背景 上星期去CRM上开发一个功能,该系统里面有自动分页,需要在实体类里加入一个分页变量 // 分页 private PageInfo pageInfo = new PageInfo(); 这个本来没有什么影响,但在抽离接口jar包的时候,所用到的类必须实现序列化接口 而这个PageInfo对象因为在抽离的类中,所以PageInfo类也必须实现序列化,十分不爽 因为PageInfo类不是我们开发的,修改这个类去实现序列化接口不好 transient是个不常用的修饰符,这时它的作用就体现出来了

JavaSE入门学习10:Java修饰符

Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: <span style="font-size:18px;">public class className { // ... } private boolean flag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42;

Java 修饰符

Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] argum

修饰符

Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] argum

Java的修饰符

转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主要有两类修饰符: 访问修饰符:default, public , protected, private 非访问修饰符:final, abstract, strictfp 修饰符一般使用在一个语句的前端,例: [html] view plain copy public void Pig{ int a 

Java-basic-3-运算符-修饰符-循环

运算符: 与C++类似,特殊的有: 1)按位右移补零操作符: 2)instanceof运算符:判断一个实例是否是某类/接口类型 如果是/类型兼容,则返回true // superclass class Vehicle {} // subclass class Car extends Vehicle {} public class test{ public static void main(String args[]) { Vehicle a = new Car(); // return true

Java-004-变量类型和修饰符详解

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #000000 } Java的变量 Java中主要有如下几种类型的变量:局部变量.类变量(静态变量).成员变量(非静态变量) 变量其实是java中的一个最基本的单元,也就是内存中的一块区域, Java中的变量有四个基本属性:变量名,数据类型,存储单元和变量值 ◆变量名:合法的标识符 ◆变量的数据类型:可以是基本类型和引用类型(必须包含类型)

Java基本语法(标识符、修饰符、关键字)

一.标识符 Java 所有的组成部分都需要名字.标识符适用于包名.类名.变量名.方法名.对象名.数组名.集合名等的命名. 关于 Java 标识符,有以下几点需要注意: 1).所有的标识符都应该以字母(a-z或者A-Z),美元符号($),阿拉伯数字(1-9)或者下划线的任意字符组成 2).不能以数字开头 3).关键字不能做标识符 4).java标识符中对字母大小写要求敏感 实例: 合法标识符举例:age.$salary._value.__1_value 不合法标识符举例:123abc.-salar

java修饰符public final static abstract transient

JAVA 修饰符public final static abstract transient 关键字: public final static abstract ... 1.public protected default private 组 位置                        private      默认      protected        public 同一个类                    是            是         是