`
CB-13
  • 浏览: 21477 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java 串行化(序列化)

阅读更多
串行化(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,不能被串行化。
分享到:
评论

相关推荐

    Java 串行化(序列化)Serializable/Externalizable

    NULL 博文链接:https://zhycaf.iteye.com/blog/982092

    对象序列化 串行化

    对象序列化 串行化 实现java对象的保存

    串行化和反串行化

    串行化/序列化:将java对象转换成某种格式(JVM定义的)的字节数组 串行化使用场景: 将对象用户网络间传输或者是本地化储存。 反串行化:将字节数组恢复成java对象。 package com.yongjun.io; import java.io....

    JAVA笔记??序列化

    所谓的对象序列化(在很多地方也被成为串行化),是指将对象转换成二进制数据流的一种实现手段。通过将对象序列化,可以方便地实现对象的传输及保存。  在Java中提供有ObjectInputStream与ObjectOutputStream这两...

    Google.ProtocolBuffers.2.4.1.555

    Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的...

    即时聊天(序列化)

    采用序列化串行接口方式首发 有服务端,客户端。 运行先启动服务端,并给一个空闲端口 例如6789 之后开启客户端(可多个测试) 客户端输入服务端的ip 端口 和你的昵称即可

    Java初级、中级、高级面试题及答案

    事务\事务隔离级别\Mysql默认隔离级别\串行化\存储引擎Innodb\Myisam\Inodb锁机制\MVCC\B树索引\哈希索引\聚簇索引\非聚簇索引\回表查询和覆盖索引\Explain语句\SQL语句的执行过程\范式\聚合函数\SQL优化\HTTP\多态\...

    protobuf-java-3.5.1

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...

    深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

    Netty的高并发高性能架构设计精髓包括:主从Reactor线程模型,NIO多路复用非阻塞,无锁串行化设计思想,支持高性能序列化协议,零拷贝(直接内存的使用),ByteBuf内存池设计,灵活的TCP参数配置能力,以及并发优化...

    Java思维导图xmind文件+导出图片

    理解通信协议传输过程中的序列化和反序列化机制 基于框架的RPC通信技术 WebService/ApacheCXF RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC...

    protoc使用说明

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...

    protobuf-3.4.0.zip

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...

    失物招领平台源码java-da-streamingledger:流数据上的可序列化ACID事务

    流数据上的可序列化 ACID 事务 data Artisans Streaming Ledger 是一个基于 的库,用于使用可序列化的 ACID 语义处理跨多个共享状态/表的事件流。 数据 Artisans Streaming Ledger 允许您定义一组状态,连接驱动事务...

    JSON-RPC-Java:Random.org JSON-RPC API(修订版1)Java实现

    它通过RandomOrgClient类提供对API的已签名和未签名方法的序列化或非序列化访问。 它还通过RandomOrgClient类提供了一个便利类,即RandomOrgCache,用于预先缓存请求。 在此模块的上下文中,串行化客户端是为其请求...

    Google Protobuffer C#

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...

    Java数据编程指南

    数据定义 基本数据操作 数据完整性 表达式 连接 合并 子查询 小结 附录B 序列化 简介 序列化 可串行化的接口 小结 附录C Java和分布式应用程序 分布式系统 分布式...

    整理后java开发全套达内学习笔记(含练习)

    序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,...

    PHP安装protobuf详解

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...

    Protobuf协议快速入门指南(一个小时入门protobuf)

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...

Global site tag (gtag.js) - Google Analytics