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对象转换为字节 ...
随机推荐
- Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)
service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一 ...
- 实践作业1:测试管理工具实践 Day4
由小组吴辉同学和王俊杰同学负责撰写使用手册,详细记录了环境配置完整过程,以及从软件登陆开始,创建一个测试计划,创建新版本,创建测试用例集,分配测试用例到测试计划,关联到测试用例这一系列完整过程. 刘思 ...
- poj 3111 K Best 最大化平均值 二分思想
poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...
- sqlserver 全库查询 带架构
网上现有的全库查询,无法识别自定义架构的数据库结构: ) ) ) declare @counts int )--以上定义变量 declare cur1 cursor for select a.name ...
- python3 scrapy+Crontab部署过程
背景 最近有时间想学习下python3+scrapy,于是决定写一个小程序来练练手. 开发环境:MacOS High Sierra(10.13.1)+python3+scrapy. 开发工具:PyCh ...
- 对象存取器属性:getter和setter
在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o.a,这就是一个读的操作,而o.b = 1则是一个写的操作.事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都 ...
- 关于sqlmap使用手册
sqlmap 使用手册 官方wiki Github sqlmap也是渗透中常用的一个注入工具,可以用来检测sql注入漏洞. 功能与作用 完全支持MySQL,Oracle,PostgreSQL,Micr ...
- sphinx+reStructuredText制作文档
1 spinx简介 Sphinx 是一种文档工具,它可以令人轻松的撰写出清晰且优美的文档, 由 Georg Brandl 在BSD 许可证下开发. 新版的Python文档 就是由Sphinx生成的,并 ...
- svn 批量加入没有加入版本号控制的文件命令
svn st | awk '{if($1=="?"){print$2}}'|xargs svn add
- 单点登录(一)使用Cookie+File实现单点登录
本文使用Cookies+Filter实现www.taobao.tgb.com 和 www.tianmao.tgb.com的单点登录. 源代码分享:链接: http://pan.baidu.com/s/ ...