`

Java transient 关键字

 
阅读更多

 

  •    transient的作用及使用方法
  •    transient使用小结
  •    transient使用细节——被transient关键字修饰的变量真的不能被序列化吗?

    transient的作用及使用方法

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

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

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

 

     具体示例参见下面的方法

public class User implements Serializable {
	private String username;
	private transient String password;
	//get and set method
	@Override
	public String toString() {
		return username + "," + password;
	}
}

     

public class TestTransient {
	
	public static void main(String[] args) {
		
		User user = new User();
        user.setUsername("rmtest");
        user.setPassword("rmtestpwd");
        
        try {
        	ObjectOutputStream objOutStream = new ObjectOutputStream(new FileOutputStream(("D://user.txt")));
        	objOutStream.writeObject(user);
        	objOutStream.flush();
        	objOutStream.close();
        } catch(Exception e) {
        	e.printStackTrace();
        }
        
        try {
        	ObjectInputStream objInputStream = new ObjectInputStream(new FileInputStream("D://user.txt"));
        	user = (User) objInputStream.readObject();
        	objInputStream.close();
        	System.out.println(user);
        } catch(Exception e) {
        	e.printStackTrace();
        }
		
	}

}

    输出结果:rmtest,null

 

 

    transient使用小结

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

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

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

     

public class User implements Serializable {
	private String username;
	private transient static String password;

	.. get set...
	@Override
	public String toString() {
		return username + "," + password;
	}
}

    

public class TestTransient {
	
	public static void main(String[] args) {
		
	User user = new User();
        user.setUsername("rmtest");
        user.setPassword("rmtestpwd");
        
        try {
        	ObjectOutputStream objOutStream = new ObjectOutputStream(new FileOutputStream(("D://user.txt")));
        	objOutStream.writeObject(user);
        	objOutStream.flush();
        	objOutStream.close();
        } catch(Exception e) {
        	e.printStackTrace();
        }
        
        try {
        	user.setPassword("rmtestpwd2");
        	ObjectInputStream objInputStream = new ObjectInputStream(new FileInputStream("D://user.txt"));
        	user = (User) objInputStream.readObject();
        	objInputStream.close();
        	System.out.println(user);
        } catch(Exception e) {
        	e.printStackTrace();
        }
		
	}

}

    输出结果:rmtest,rmtestpwd2

   

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

   

public class TestExternalizable implements Externalizable {
	
	private transient String content = "测试序列化";

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

	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		content = (String) in.readObject();
	}
	
	public static void main(String[] args) throws IOException, Exception {
		TestExternalizable tExternal = new TestExternalizable();
		ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File("D:\\ztest.txt")));
        out.writeObject(tExternal);
        ObjectInput in = new ObjectInputStream(new FileInputStream(new File("D:\\ztest.txt")));
        tExternal = (TestExternalizable) in.readObject();
        System.out.println(tExternal.content);
	}

}

    输出结果:测试序列化

    我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

 

   refer from http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

 

 

 

   

 

分享到:
评论

相关推荐

    Java transient关键字使用小记

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...

    Java_transient关键字

    ### Java中的transient关键字详解 在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列化过程中对特定变量的控制。当一个类实现了`Serializable`接口时,其对象可以被序列化为一个持久化的...

    Java transient关键字原理解析

    Java transient关键字原理解析 Java 中的 transient 关键字是一个重要的概念,它被用来表示变量将不被序列化处理。那么在理解 transient 关键字之前,我们先了解下什么是序列化。 序列化是对象进行持久化处理,也...

    Java中的transient关键字.doc

    Java 中的 transient 关键字 在 Java 编程中,transient 关键字是一个非常重要的概念,它用来说明一个属性是临时的,不会被序列化。在 Java 中,序列化是指将对象的状态信息转换为字节流的过程,以便于对象在网络上...

    Java transient关键字与序列化操作实例详解

    Java transient关键字与序列化操作实例详解 Java语言中的transient关键字是用来修饰变量的,表明该变量不会被Java虚拟机(JVM)序列化,即不会被写入到二进制流中。序列化是Java语言中的一种机制,用于将对象转换为...

    Java之transient关键字.Java

    在给定的文件列表中,除了与`transient`关键字相关的`Java之transient关键字.md`文件,其他如`javaweb\Tomcat.md`、`javaweb\Cookie、Session、localStorage、sessionStorage区别和用法.md`等文件可能涉及Web开发中...

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

    Java中的`transient`关键字是用于标记类的成员变量,表明该变量不应该参与序列化过程。当一个类实现了`Serializable`接口,其对象可以被序列化,即将对象的状态转换为字节流,以便存储或在网络中传输。序列化是Java...

    java中transient关键字用法分析

    主要介绍了java中transient关键字用法,以实例形式分析了java中transient关键字的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字)

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字) Java序列化和反序列化是Java虚拟机中的一种重要机制,它们可以将Java对象转换为二进制数据,然后...

    Java的关键字与保留字

    在深入探讨Java的关键字与保留字之前,我们首先需明确两个概念:关键字和保留字。在编程语言中,关键字是预定义的具有特殊含义的标识符,它们在编译时被解析器识别并执行特定的功能;而保留字则是语言设计者为未来...

    java关键字transient

    **transient关键字的作用** `transient`关键字用于标记一个实例变量,表示这个变量不应该作为对象状态的一部分进行序列化。当一个对象被序列化时,`transient`修饰的变量会被忽略,它们的值不会包含在序列化的表示中...

    Java关键字Transient与串行化

    在Java编程语言中,`transient`关键字与对象的序列化(serialization)机制密切相关,它在处理对象状态的持久化时扮演着关键角色。本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ...

    Java基础之关键字_Java基础之关键字_源码

    在编程语言的学习中,了解和掌握关键字是至关重要的一步,特别是在Java这种强类型的语言中。本文将深入探讨Java中的关键字,这些关键字是Java语法结构的基础,它们被Java编译器特殊处理,有着特定的含义和功能。 ...

    Java中的transient关键字介绍

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化密切相关。序列化是指将对象的状态转换为字节流,以便存储或在网络上传输。当一个类实现了`Serializable`接口,它的实例就可以被序列化...

    java关键字总结文档

    ### Java关键字总结 Java是一种广泛使用的面向对象编程语言,它具备简单性、可移植性、高性能等特点。在Java中,关键字具有特殊的语法含义,不能用作标识符(例如变量名或方法名)。以下是对给定文件中提到的Java...

    transient Java语言的关键字

    transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,

    Java关键字详细解

    `transient`关键字表明字段不应该序列化。`native`表示方法的实现是在其他地方(如C/C++)完成的,通常与Java的JNI(Java Native Interface)一起使用。 最后,`package`关键字用于组织类和接口,提供命名空间,...

Global site tag (gtag.js) - Google Analytics