文档章节

java序列化和反序列化

EDIAGD
 EDIAGD
发布于 2014/06/07 10:19
字数 1187
阅读 98
收藏 5

在JAVA中,一个大的应用程序需要保存很多对象的时候,由于虚拟机内存有限,有时不可能所有有用的对象都放到内存中,因此,需要将不常用的对象暂时持久化的文件中,当需要这个对象时,再从文件把对象恢复到内存中,这就是所谓对象的序列化和反序列化。本文讲实现如何将对象序列化到文件,然后再从文件反序列化到对象,你会发现其实特别简单

 

先看一下对象的序列化和反序列化的关键是什么

1,首先被序列化的对象必须实现 java.io.Serializable 接口,咳~~咳~~,其实这个接口没定义任何方法

 

2,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件

 

3,反之,反序列化时用到对象输入流ObjectIntputStream,  然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型

 

4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量)

 

5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错

 

好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来

先创建会员类

Java代码

  1. import java.io.*;   
  2. import java.util.*;   
  3.   
  4. //一定要实现Serializable接口才能被序列化   
  5. public class UserInfo implements Serializable {   
  6.     public String userName;   
  7.     public String userPass;   
  8.     //注意,userAge变量前面的transient   
  9.     public transient int userAge;   
  10.   
  11.     public UserInfo(){   
  12.     }   
  13.   
  14.     public UserInfo(String username,String userpass,int userage){   
  15.         this.userName=username;   
  16.         this.userPass=userpass;   
  17.         this.userAge=userage;   
  18.     }   
  19.   
  20.     public String toString(){   
  21.         return "用户名: "+this.userName+";密码:"+this.userPass+   
  22.             ";年龄:"+this.userAge;   
  23.     }   
  24. }  

接着我们开始写如何序列化和反序列化,初学认真看哦

Java代码

  1. import java.io.*;   
  2. import java.util.*;   
  3. public class Test {   
  4.   
  5.     //序列化对象到文件   
  6.     public static void serialize(String fileName){   
  7.         try  
  8.         {   
  9.             //创建一个对象输出流,讲对象输出到文件   
  10.             ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));   
  11.   
  12.             out.writeObject("序列化日期是:");  //序列化一个字符串到文件   
  13.   
  14.             out.writeObject(new Date());    //序列化一个当前日期对象到文件   
  15.   
  16.             UserInfo user=new UserInfo("renyanwei","888888",20);   
  17.             out.writeObject(user);  //序列化一个会员对象   
  18.   
  19.             out.close();   
  20.         }   
  21.         catch (Exception x)   
  22.         {   
  23.             System.out.println(x.toString());   
  24.         }   
  25.            
  26.     }   
  27.     //从文件反序列化到对象   
  28.     public static void deserialize(String fileName){   
  29.         try  
  30.         {   
  31.             //创建一个对象输入流,从文件读取对象   
  32.             ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));   
  33.   
  34.             //注意读对象时必须按照序列化对象顺序读,否则会出错   
  35.             //读取字符串   
  36.             String today=(String)(in.readObject());   
  37.             System.out.println(today);   
  38.   
  39.             //读取日期对象   
  40.             Date date=(Date)(in.readObject());   
  41.             System.out.println(date.toString());   
  42.   
  43.             //读取UserInfo对象并调用它的toString()方法   
  44.             UserInfo user=(UserInfo)(in.readObject());             
  45.             System.out.println(user.toString());   
  46.   
  47.             in.close();   
  48.         }   
  49.         catch (Exception x)   
  50.         {   
  51.             System.out.println(x.toString());   
  52.         }   
  53.            
  54.     }   
  55.   
  56.     public static void main(String[] args) {       
  57.         serialize("D:\\test.txt");   
  58.         System.out.println("序列化完毕");   
  59.   
  60.         deserialize("D:\\test.txt");   
  61.         System.out.println("反序列化完毕");   
  62.     }   
  63.   
  64. }  

运行结果:


序列化完毕
今天是:
Thu Oct 23 18:31:11 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕

我们看代码总结一下,serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。

deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取

大家看了结果就应该知道了,标明transit的实例变量是没被序列化进去的 ,呵呵

 

其实序列化的意义不止如此,不但可以将对象放到文件流,还可以放到网络流里,比如我们做的Socket程序,你不但可以发送给对方一行消息,还可以发送过去一个对象,我估计QQ就不止是把我们的消息发送到对方,应该是一个对象,里面包含了发送者的信息什么的。呵呵 有兴趣的可以做一下哈

后续有很多开发填坑的文章发布,如果对你有帮助,请支持和加关注一下

http://e22a.com/h.05ApkG?cv=AAKHZXVo&sm=339944

https://shop119727980.taobao.com/?spm=0.0.0.0 

本文转载自:http://blog.csdn.net/wangzhiqing3/article/details/8392803

共有 人打赏支持
EDIAGD
粉丝 49
博文 149
码字总数 58327
作品 0
嘉定
后端工程师
私信 提问
Java序列化与JSON序列化大比拼

一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语...

NoahX
2013/03/10
0
20
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神
05/08
0
0
序列化框架比较:kryo & hessian & Protostuff & java

序列化框架性能对比(kryo、hessian、java、protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf ...

鉴客
2013/03/04
11K
0
Serializable & Parcelable

对象序列化的简单介绍 所谓对象的序列化其实就是把JVM运行过程中生成的对象通过特殊的处理手段转换为字节形式的文件。转换之后就可以将其永久保存到磁盘中,或者以字节流进行网络传输。 在A...

吴七禁
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
50分钟前
3
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
6
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
6
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
5
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部