K:java序列化与反序列化—transient关键字的使用
首先,应该明白的是transient是java中的一个关键字,音标为 英: [ˈtrænziənt]。
在了解transient关键字之前,应该先弄明白序列化和反序列化。所谓的序列化,通俗点的来说,就是将一个对象转化为字节序列的形式来表示,这些字节序列中包含了一个对象的相关属性信息。一个对象进行序列化之后,可以被存储到硬盘当中,也可以用于网络传输。而反序列化便是将一个对象的字节序列转化为原先的java对象,这个过程便是反序列化。
在java中,transient关键字的作用是让被该transient关键字所修饰的成员属性不被序列化。
示例代码如下:
package other.serial;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
 * 该类的代码用于演示transient关键字的使用
 * @author 学徒
 *
 */
public class Person implements Serializable
{
	private String name="张红";
	private String sex="女";
	//女人的年龄是秘密,不能被外面的人知道
	private transient int age=10;
	//重载Object类的toString方法
	@Override
	public String toString()
	{
		return "姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age;
	}
	public static void main(String[] args)throws Exception
	{
		String path="H:\\xiaohonghong.obj";
		//输出对象的信息并进行序列化操作
		Person xiaohong=new Person();
		System.out.println(xiaohong);
		File output=new File(path);
		FileOutputStream out=new FileOutputStream(output);
		ObjectOutputStream outputObject=new ObjectOutputStream(out);
		outputObject.writeObject(xiaohong);
		//进行反序列化操作并输出对象信息
		File input=new File(path);
		FileInputStream in=new FileInputStream(input);
		ObjectInputStream inputObject=new ObjectInputStream(in);
		xiaohong=(Person)inputObject.readObject();
		System.out.println(xiaohong);
	}
}
运行结果:
姓名:张红  性别:女  年龄:10
姓名:张红  性别:女  年龄:0
至于为什么要不被序列化,其主要是为了节省存储空间,以及为了保证程序的整体逻辑
需要注意的是:
- transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量(即局部变量)是不能被transient关键字修饰的。
- 被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
还有一点需要值得注意的是,在实现了Serializable接口的时候,其序列化过程是默认自动进行的,为此,被transient修饰符所修饰的成员变量不被序列化。而当使用Externalizable接口实现序列化操作的时候,其序列化过程是程序编写人员进行控制的,没有任何东西会进行自动的序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
实例代码如下:
package other.serial;
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;
/**
 * 该类的代码用于演示transient关键字的使用
 * @author 学徒
 *
 */
public class Person implements Externalizable
{
	private String name="张红";
	private String sex="女";
	//女人的年龄是秘密,不能被外面的人知道
	private transient int age=10;
	//重载Object类的toString方法
	@Override
	public String toString()
	{
		return "姓名:"+this.name+"  性别:"+this.sex+"  年龄:"+this.age;
	}
	public static void main(String[] args)throws Exception
	{
		String path="H:\\xiaohonghong.obj";
		//输出对象的信息并进行序列化操作
		Person xiaohong=new Person();
		System.out.println(xiaohong);
		File output=new File(path);
		FileOutputStream out=new FileOutputStream(output);
		ObjectOutputStream outputObject=new ObjectOutputStream(out);
		outputObject.writeObject(xiaohong);
		//进行反序列化操作并输出对象信息
		File input=new File(path);
		FileInputStream in=new FileInputStream(input);
		ObjectInputStream inputObject=new ObjectInputStream(in);
		xiaohong=(Person)inputObject.readObject();
		System.out.println(xiaohong);
	}
	/**
	 * 控制需要进行序列化的成员变量
	 */
	@Override
	public void writeExternal(ObjectOutput out) throws IOException
	{
		out.writeObject(name);
		out.writeObject(sex);
		//女人的年龄虽然是个秘密,但是序列化我是个大嘴巴,我要告诉别人
		out.writeInt(age);
	}
	/**
	 * 控制进行反序列化的成员变量
	 */
	@Override
	public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException
	{
		this.name=(String)in.readObject();
		this.sex=(String)in.readObject();
		//这样我就知道女人的年龄了
		this.age=in.readInt();
	}
}
运行结果:
姓名:张红  性别:女  年龄:10
姓名:张红  性别:女  年龄:10
K:java序列化与反序列化—transient关键字的使用的更多相关文章
- Java基础(五)-Java序列化与反序列化
		.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ... 
- java序列化和反序列化使用总结
		一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输 ... 
- java序列化和反序列化及序列化方式
		平时我们在Java内存中的对象,是无 法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即 存储对象中的状态 ... 
- Java序列化及反序列化
		序列化概念: 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道 ... 
- Java 序列化和反序列化(一)Serializable 使用场景
		目录 Java 序列化和反序列化(一)Serializable 使用场景 1. 最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:tr ... 
- Java序列化与反序列化
		Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ... 
- [转] Java序列化与反序列化
		原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ... 
- java序列化与反序列化(转)
		Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ... 
- Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?
		Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节 ... 
随机推荐
- P1040 加分二叉树
			转自:(http://www.cnblogs.com/geek-007/p/7197439.html) 经典例题:加分二叉树(Luogu 1040) 设一个 n 个节点的二叉树 tree 的中序遍历为 ... 
- poj 3111 K Best 最大化平均值 二分思想
			poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ... 
- HDU1075-What Are You Talking About
			What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K ... 
- 用Redis轻松实现秒杀系统
			秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题.对这类问题,有三种优化性能的思路: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理 用上这三招,不论秒杀时负载多大,都能轻松应 ... 
- JAVA IO分析一:File类、字节流、字符流、字节字符转换流
			因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ... 
- [Bootstrap 源码]——bootstrap源码之初始化
			bootstrap源码之初始化 我们先来分析normalize.less编译后的源码,我们知道normalize.css是一个专门将不同浏览器的默认css特性设置为统一效果的css库,它和reset. ... 
- Angular页面加载闪现解决方案 ng-cloak
			在做Angular项目时,经常会遇见在浏览器上闪烁表达式({{ express }} ),及模块(div)的闪烁,会闪现/闪烁隐藏的数据,之前用过vue.js,可以通过v-clock解决,同理Angu ... 
- Java数据结构和算法(八)——递归
			记得小时候经常讲的一个故事:从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容是“从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和 ... 
- Python--Pycharm backup_ver1.py 控制台一直Backup FAILED
			1.windows不自带zip,需自行安装,http://gnuwin32.sourceforge.net/packages/zip.htm 2.安装后,要配置环境变量:PATH 3.简明Python ... 
- 【译】使用Jwt身份认证保护 Asp.Net Core Web Api
			原文出自Rui Figueiredo的博客,原文链接<Secure a Web Api in ASP.NET Core> 摘要:这边文章阐述了如何使用 Json Web Token (Jw ... 
