串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,打回原形。
一、串行化的意义:
1:解决Web应用程序的无状态弊端
一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中—— 只要是可以存储的任何地方。需要恢复对象时,仅仅只需从它存储的位置反串行化即可。对象固有的这种特性对于无状态的Web应用程序是非常重要的,因为它允许重要的状态信息可以在用户请求之间保留。
2:应用程序边界之间传递对象
串行化也允许对象在应用程序边界之间传递,编程人员可以将描述对象状态的字节流在网络上传递,并在另一端反串行化成一个匹配的对象。从本质上讲,串行化允许对象以“数值”的方式传递给另一个应用程序。
二:串行化对象
在java中串行化对象必须:
1、该对象的类必须实现Serializable接口。
2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。而对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 。
注:保存任何的成员方法和静态的成员变量没有任何的意义,因为,对象的类已经完整的保存了他们。
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
三:具体实现
1、串行化的对象:Person类
import java.io.Serializable;
/*
* time:2008-07-19
* author:coke
*/
/*
*必须实现Serializable
*/
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int age; // will persist
private String name; // will persist
// transient 为Java保留字,告诉JVM以transient宣告的基本型态(primitive type)或物
// 件(object)变量不要序列化,例如敏感性数据像是密码等。
private transient String pwd; // will not persist
public Person() {
}
public Person(int age, String name,String pwd) {
this.age = age;
this.name = name;
this.pwd=pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
2、串行化和反串行化
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
/*
* time:2008-07-19
* author:coke
*/
public class TestSerializable {
private static File f = null;
//串行化
public static void serialization() {
f = new File("D://t.m");
try {
if (f.exists())
f.delete();
f.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Person p = new Person(10, "xplq", "123456");
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(f));
out.writeObject(p);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//反串行化
public static void deserialization() {
if (!f.exists())
return;
try {
ObjectInputStream input = new ObjectInputStream(
new FileInputStream(f.getPath()));
try {
Person p = (Person) input.readObject();
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getPwd());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//测试
public static void main(String[] args) {
TestSerializable.serialization();
TestSerializable.deserialization();
}
}
3.测试结果
xplq
10
null
因为pwd transient,不能被串行化。
分享到:
相关推荐
NULL 博文链接:https://zhycaf.iteye.com/blog/982092
对象序列化 串行化 实现java对象的保存
串行化/序列化:将java对象转换成某种格式(JVM定义的)的字节数组 串行化使用场景: 将对象用户网络间传输或者是本地化储存。 反串行化:将字节数组恢复成java对象。 package com.yongjun.io; import java.io....
所谓的对象序列化(在很多地方也被成为串行化),是指将对象转换成二进制数据流的一种实现手段。通过将对象序列化,可以方便地实现对象的传输及保存。 在Java中提供有ObjectInputStream与ObjectOutputStream这两...
Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的...
采用序列化串行接口方式首发 有服务端,客户端。 运行先启动服务端,并给一个空闲端口 例如6789 之后开启客户端(可多个测试) 客户端输入服务端的ip 端口 和你的昵称即可
事务\事务隔离级别\Mysql默认隔离级别\串行化\存储引擎Innodb\Myisam\Inodb锁机制\MVCC\B树索引\哈希索引\聚簇索引\非聚簇索引\回表查询和覆盖索引\Explain语句\SQL语句的执行过程\范式\聚合函数\SQL优化\HTTP\多态\...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
Netty的高并发高性能架构设计精髓包括:主从Reactor线程模型,NIO多路复用非阻塞,无锁串行化设计思想,支持高性能序列化协议,零拷贝(直接内存的使用),ByteBuf内存池设计,灵活的TCP参数配置能力,以及并发优化...
理解通信协议传输过程中的序列化和反序列化机制 基于框架的RPC通信技术 WebService/ApacheCXF RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper ...
序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
流数据上的可序列化 ACID 事务 data Artisans Streaming Ledger 是一个基于 的库,用于使用可序列化的 ACID 语义处理跨多个共享状态/表的事件流。 数据 Artisans Streaming Ledger 允许您定义一组状态,连接驱动事务...
它通过RandomOrgClient类提供对API的已签名和未签名方法的序列化或非序列化访问。 它还通过RandomOrgClient类提供了一个便利类,即RandomOrgCache,用于预先缓存请求。 在此模块的上下文中,串行化客户端是为其请求...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
数据定义 基本数据操作 数据完整性 表达式 连接 合并 子查询 小结 附录B 序列化 简介 序列化 可串行化的接口 小结 附录C Java和分布式应用程序 分布式系统 分布式...
序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...