今年大四了,拼命做笔试题,看到了Java序列化是什么?
其实Java序列化和Java串行化都是一样的,都对应英文中的Serializable。可能是翻译的时候不统一,我一开始的时候以为是两个不同的概念呢。
一、什么是序列化?
一个对象随着创建而存在,随着程序结束而结束。那如果我要保存一个对象的状态呢?Java序列化能够将对象的状态写入byte流存储起来,也从其他地方将byte流读取出来,重新构造一个新的对象。这种机制允许你将对象通过网络进行传播,并且可以随时把对象持久化到数据库、文件系统中。简而言之,序列化就是将一个对象的状态保存起来,而反序列化就是将已经保存的流对象恢复成原来的对象。
二、如何实现序列化?
实现序列化有一个条件,即实现序列化的类必须实现java.io.Serializable接口。之后可以利用ObjectInputStream的readOjbect()方法和OjbectOutputStream的writeObject()方法进行对象的读和写,即反序列化和序列化。具体的demo如下:
a)Java对象
在java中要想使一个java对象可以实现序列化与反序列化,必须让该类实现java.io.Serializable接口
java.io.Serializable接口定义如下:
publicinterfaceSerializable {
}
|
从上述定义中可以看到该接口中未定义任何方法,这大大的简化了开发者
b)序列化主要依赖java.io.ObjectOutputStream类,该类对java.io.FileOutputStream进一步做了封装,这里主要使用ObjectOutputStream类的writeObject()方法实现序列化功能
Demo:
/**
*将对象序列化到磁盘文件中
*@paramo
*@throwsException
*/
publicstaticvoidwriteObject(Object o)throwsException{
File f=newFile("d:""user.tmp");
if(f.exists()){
f.delete();
}
FileOutputStream os=newFileOutputStream(f);
//ObjectOutputStream核心类
ObjectOutputStream oos=newObjectOutputStream(os);
oos.writeObject(o);
oos.close();
os.close();
}
|
c)反序列化主要依赖java.io.ObjectInputStream类,该类对java.io.InputStream进一步做了封装,这里主要使用ObjectInputStream类的readObject()方法实现序列化功能
Demo:
/**
*反序列化,将磁盘文件转化为对象
*@paramf
*@return
*@throwsException
*/
publicstaticUser readObject(File f)throwsException{
InputStream is=newFileInputStream(f);
//ObjectOutputStream核心类
ObjectInputStream ois=newObjectInputStream(is);
return(User)ois.readObject();
}
|
贴出完整的demo
Java对象:
packagecom.io.bean;
importjava.io.Serializable;
publicclassUserimplementsSerializable{
privateintuserId;
privateStringuserName;
privateStringuserSex;
privateintuserAge;
publicintgetUserAge() {
returnuserAge;
}
publicvoidsetUserAge(intuserAge) {
this.userAge= userAge;
}
publicintgetUserId() {
returnuserId;
}
publicvoidsetUserId(intuserId) {
this.userId= userId;
}
publicString getUserName() {
returnuserName;
}
publicvoidsetUserName(String userName) {
this.userName= userName;
}
publicString getUserSex() {
returnuserSex;
}
publicvoidsetUserSex(String userSex) {
this.userSex= userSex;
}
@Override
publicString toString() {
returnthis.getUserId() +" "+this.getUserName()
+" "
+this.getUserSex() +" "+this.getUserAge();
}
}
|
序列化与反序列化
packagecom.io.test;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importcom.io.bean.User;
publicclassTestSerializable {
/**
*将对象序列化到磁盘文件中
*@paramo
*@throwsException
*/
publicstaticvoidwriteObject(Object o)throwsException{
File f=newFile("d:""user.tmp");
if(f.exists()){
f.delete();
}
FileOutputStream os=newFileOutputStream(f);
//ObjectOutputStream核心类
ObjectOutputStream oos=newObjectOutputStream(os);
oos.writeObject(o);
oos.close();
os.close();
}
/**
*反序列化,将磁盘文件转化为对象
*@paramf
*@return
*@throwsException
*/
publicstaticUser readObject(File f)throwsException{
InputStream is=newFileInputStream(f);
//ObjectOutputStream核心类
ObjectInputStream ois=newObjectInputStream(is);
return(User)ois.readObject();
}
publicstaticvoidmain(String[] args)throwsException{
/*****************将对象序列化***************/
/*
User user=new User();
user.setUserId(1);
user.setUserName("张艺谋");
user.setUserSex("男");
user.setUserAge(50);
TestSerializable.writeObject(user);
*/
/*****************将对象序反列化***************/
User user=TestSerializable.readObject(newFile("d:""user.tmp"));
System.out.println(user);
}
}
|
参考资料:
1.http://www.blogjava.net/sxyx2008/archive/2009/11/09/301663.html
2.http://blog.csdn.net/yakihappy/article/details/3979373
分享到:
相关推荐
对象序列化 串行化 实现java对象的保存
NULL 博文链接:https://zhycaf.iteye.com/blog/982092
串行化/序列化:将java对象转换成某种格式(JVM定义的)的字节数组 串行化使用场景: 将对象用户网络间传输或者是本地化储存。 反串行化:将字节数组恢复成java对象。 package com.yongjun.io; import java.io....
在Java中提供有ObjectInputStream与ObjectOutputStream这两个类用于序列化对象的操作。这两个类是用于存储和独缺对象的输入输出流类,只要把对象中的所有成员变量都存储起来,等于保存了这个对象,之后从保存的...
采用序列化串行接口方式首发 有服务端,客户端。 运行先启动服务端,并给一个空闲端口 例如6789 之后开启客户端(可多个测试) 客户端输入服务端的ip 端口 和你的昵称即可
Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的...
理解通信协议传输过程中的序列化和反序列化机制 基于框架的RPC通信技术 WebService/ApacheCXF RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper ...
事务\事务隔离级别\Mysql默认隔离级别\串行化\存储引擎Innodb\Myisam\Inodb锁机制\MVCC\B树索引\哈希索引\聚簇索引\非聚簇索引\回表查询和覆盖索引\Explain语句\SQL语句的执行过程\范式\聚合函数\SQL优化\HTTP\多态\...
Java 输入输出流实验 本实验主要介绍了 Java 中的输入输出流,包括 ...本实验总结了 Java 中的输入输出流、对象的序列化和反序列化、文件流和对象的串行化等知识点,并提供了一个完整的实验过程和代码实现。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC...
数据定义 基本数据操作 数据完整性 表达式 连接 合并 子查询 小结 附录B 序列化 简介 序列化 可串行化的接口 小结 附录C Java和分布式应用程序 分布式系统 分布式...
流数据上的可序列化 ACID 事务 data Artisans Streaming Ledger 是一个基于 的库,用于使用可序列化的 ACID 语义处理跨多个共享状态/表的事件流。 数据 Artisans Streaming Ledger 允许您定义一组状态,连接驱动事务...
Netty的高并发高性能架构设计精髓包括:主从Reactor线程模型,NIO多路复用非阻塞,无锁串行化设计思想,支持高性能序列化协议,零拷贝(直接内存的使用),ByteBuf内存池设计,灵活的TCP参数配置能力,以及并发优化...
在此模块的上下文中,串行化客户端是为其请求序列与响应序列匹配的客户端。安装需要 lib和 lib才能正常运行,而 lib和 lib可以运行测试。用法默认设置最适合非时间紧迫的序列化请求,例如批处理客户端: ...
序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,...
通用对象序列化程序(如)通常用于Java和JSON开发上下文中。 它们相对容易设置,并且总体上做得很好。 实际的映射是在运行时编织的,通常是在编译时声明和配置的。 这 ...: 简化了开发人员的工作,尤其是当模型经常...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化...
XXL工具 XXL-TOOL,一系列保持Java高效的工具。 介绍 XXL-TOOL是使Java保持高效的一系列工具。 XXL-TOOL是一个Java工具类库,致力于让Java开发更高效。包含“集合,缓存,并发,串行...json序列化,反序列化库 光纤模