transient

java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

用法

@transient 就是在给某个javabean上需要添加个属性,但是这个属性你又不希望给存到数据库中去,仅仅是做个临时变量,用一下。不修改已经存在数据库的数据的数据结构。

那么这个注解就可以一用。

只要在你准备添加的临时属性上添加这个注解,然后getter和setter自动完成一下,就可以啦。

@Document(collection = "streams")

public class Stream implements Serializable,Cloneable {

    private static final long serialVersionUID = 1L;

    @Transient

    private boolean alarmsettingsActive = false;

xxxxxxxxxxxxx

xxxxxxxxxxxxxxxxxx

}

上面的是个人理解,下面呢就是详细说说。

transient的作用

我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

transient使用小结

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

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

3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。



编码试验加以证明:

1.自定义类(为了方便,我直接在main方法所在类中添加的一个静态属性类,或者叫成员类)

```

public static class TransientTest implements Serializable{

private static final long serialVersionUID = 233858934995755239L;

private String name1;

private transient String name2;

public TransientTest(String name1,String name2){

this.name1 = name1;

this.name2 = name2;

}

public String toString(){

return String.format("TransientTest.toString(): name1=%s,name2=%s", name1,name2);

}

}

```

2.写一个测试方法

```

public static void testTransient(){

String name1="常规属性",name2="transient修饰的属性";

TransientTest test = new TransientTest(name1, name2);

System.out.println("序列化前:"+test.toString());

ObjectOutputStream outStream;

ObjectInputStream inStream;

String filePath = "D:/test/object/TransientTest.obj";

try {

outStream = new ObjectOutputStream(new FileOutputStream(filePath));

outStream.writeObject(test);

inStream = new ObjectInputStream(new FileInputStream(filePath));

TransientTest readObject = (TransientTest)inStream.readObject();

System.out.println("序列化后:"+readObject.toString());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

```

3.在main方法中执行,然后可以看到得到的结果为

印证了上面所讲的“用transient关键字标记的成员变量不参与序列化过程

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文:关键字transient是干啥的 百度百科的解释: Java语言的关键字,变量修饰符,如果用transien...
    氨基钠阅读 845评论 0 0
  • 百度百科的解释: Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值...
    飞__飞阅读 3,538评论 0 0
  • 1.从Serilizable说到transient 我们知道,如果一个对象需要序列化,那么需要实现Seriliza...
    秦怀杂货店阅读 5,300评论 0 0
  • transient义为短暂的。在Java中,transient和对象的序列化(持久化)息息相关。 在Java中,要...
    sortinnauto阅读 2,383评论 0 0
  • 作用: transient关键字可以让实现了Serializable接口的类中的属性不被序列化。就是哪个属性加了t...
    HWilliamgo阅读 1,319评论 0 0