序列化其实很好理解,假如你现在做一个项目,项目是分工合作的,并且你同其他小组成员不在同一个城市,那么你要如何把你写的那些类给其他小组成员呢?这个时候就要用到序列化了,
简单的说:序列化就是将内存中的类或者对象(你写的类都是存储在内存中的)变成可以存储到存储媒介中的流,你将类序列化成流之后可以通过互联网传输给别人,你也可以反序列化将别人的序列化流转换成内存中的对象,就这么简单

假如有两个类,分别是A和B,B类中含有一个指向A类对象的引用,现在我们对两个类进行实例化{ A a = new A(); B b = new B(); },这时在内存中实际上分配了两个空间,一个存储对象a,一个存储对象b,接下来我们想将它们写入到磁盘的一个文件中去,就在写入文件时出现了问题!因为对象b包含对对象a的引用,所以系统会自动的将a的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,内存分配了三个空间,而对象a同时在内存中存在两份,如果我想修改对象a的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所希望的!

以下序列化机制的解决方案:

1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)

2.当要保存一个对象时,先检查该对象是否被保存了。

3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象

但不是每一个类都能序列化,例如java.awt.geom包中的Point2D.Double类就是不可序列化的,因为该类没有实现Serializable接口

java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流,ObjectInputStream从字节流重构对象。

API描述

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

我们先了解ObjectOutputStream类吧。ObjectOutputStream类扩展DataOutput接口。
writeObject()方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则writeObject()方法递归序列化这些对象。每个 ObjectOutputStream维护序列化的对象引用表,防止发送同一对象的多个拷贝。(这点很重要)
下面,让我们从例子中来了解ObjectOutputStream这个类

)~#U2F'{3}#l 
bbs.spoto.net9k({%k%r3{7u,?+p1q 
// 序列化 today's date 到一个文件中. 3c7c*`!h-H2W |&l 
FileOutputStream f = new FileOutputStream("tmp"); 1M;E&R,f.o1A8[+w 
ObjectOutputStream s = new ObjectOutputStream(f); 
s.writeObject("Today"); 
s.writeObject(new Date()); 
s.flush(); ,f9Q5`2[:t Y

ObjectInputStream这个类。它与ObjectOutputStream相似。它扩展DataInput接口。 ObjectInputStream中的方法镜像DataInputStream中读取Java基本数据类型的公开方法。readObject()方法从字节流中反序列化对象。每次调用readObject()方法都返回流中下一个Object。对象字节流并不传输类的字节码,而是包括类名及其签名。 readObject()收到对象时,JVM装入头中指定的类。如果找不到这个类,则readObject()抛出 ClassNotFoundException,如果需要传输对象数据和字节码,则可以用RMI框架。ObjectInputStream的其余方法用于定制反序列化过程。:h2z(J+h,d;S5R 
例子如下:IT雏鹰部落(N,V1M&~$w

//从文件中反序列化 string 对象和 date 对象 bbs.spoto.net)/1_8[6Z H8V5| 
FileInputStream in = new FileInputStream("tmp"); 
ObjectInputStream s = new ObjectInputStream(in); 
String today = (String)s.readObject(); 
Date date = (Date)s.readObject(); ;w&d'}+n"I5r8o&c:R @

例子,来自开源中国客户端代码

/**
* 保存对象
* @param ser
* @param file
* @throws IOException
*/
//保存对象就是序列化
public boolean saveObject(Serializable ser, String file) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try{
fos = openFileOutput(file, MODE_PRIVATE);
oos = new ObjectOutputStream(fos);
oos.writeObject(ser);
oos.flush();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try {
oos.close();
} catch (Exception e) {}
try {
fos.close();
} catch (Exception e) {}
}
}

/**
* 读取对象
* @param file
* @return
* @throws IOException
*/
//反序列化
public Serializable readObject(String file){
if(!isExistDataCache(file))
return null;
FileInputStream fis = null;
ObjectInputStream ois = null;
try{
fis = openFileInput(file);
ois = new ObjectInputStream(fis);
return (Serializable)ois.readObject();
}catch(FileNotFoundException e){
}catch(Exception e){
e.printStackTrace();
//反序列化失败 - 删除缓存文件
if(e instanceof InvalidClassException){
File data = getFileStreamPath(file);
data.delete();
}
}finally{
try {
ois.close();
} catch (Exception e) {}
try {
fis.close();
} catch (Exception e) {}
}
return null;
}

转载于:https://my.oschina.net/wuyiwu/blog/87154

为什么要将对象序列化相关推荐

  1. 基于Golang的对象序列化的程序包开发——myJsonMarshal

    基于Golang的对象序列化的程序包开发--myJsonMarshal[阅读时间:约10分钟] 一.对象序列化概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体程序设计及 ...

  2. Java学习总结:51(对象序列化)

    对象序列化 对象序列化的本质实际上就是将内存中所保存的对象数据转换为二进制数据流进行传输的操作. 但并不是所有类的对象都可以直接进行序列化操作,要被序列化的对象所在的类一定要实现java.io.Ser ...

  3. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  4. 简单介绍实体类或对象序列化时,忽略为空属性的操作

    这篇文章主要介绍了实体类或对象序列化时,忽略为空属性的操作,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 第一种,在配置文件配置 在application.xml直接 ...

  5. Java对象序列化详解6,Java对象的序列化与反序列化详解

    把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ.  在网 ...

  6. 对象序列化与反序列化

    目录 序列化 反序列化 ObjectOutputStream ObjectInputStream 序列化 一个类必须实现了Serializable 接口,其对象才能序列化,Serializable接口 ...

  7. .NET 中的对象序列化 (转载)

    .NET 中的对象序列化 Piet Obermeyer Microsoft Corporation 2001 年 8 月 摘要:为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便 ...

  8. java 对象怎么序列化,java对象序列化总结

    java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...

  9. python中常用的序列化模块_Python常用模块之pickle——对象序列化

    作用 对Python对象进行序列化,便于存储和传输 Python对象序列化成bytes类型 pickle.dumps(obj) 将Python对象转化为bytes类型 pickle.loads(str ...

  10. WCF入门(三)——对象序列化

    对象序列化 WCF是通过网络实现远程方法调用的,因此参数,返回值等都需要序列化才能在网络间传输.例如,对于下面的一个服务: [ServiceContract]     public interface ...

最新文章

  1. 微信小程序在web-view页面做分享,并且把分享的参数传递给小程序
  2. 基于语音识别的微博签到系统
  3. linux下查看隐藏的文件
  4. Scribefire发CSDN博客
  5. 什么是脏数据?怎样用箱形图分析异常值?终于有人讲明白了
  6. windows server 2012安装
  7. RequestDispatcher对象的应用-请求包含
  8. jquery Demo 以及code
  9. 算法面试题_求给定字符串的排列、组合、八皇后问题
  10. Linux系统启动的标准流程
  11. 中关村GHOSTXPSP3装机自选纯净版V2010.4
  12. Svn下载及安装(附带汉化包安装)
  13. vpp之feature机制介绍
  14. Cisco2811配置Qos实现带宽分流
  15. 做一个有批判性思维的程序员
  16. java代码压缩文件
  17. debezium系列之:理解database.server.name和database.history.kafka.topic
  18. 摄像头 UIImagePickerController拍照和视频录制
  19. 数据库大赛50强之「华东师范大学」:恰同学少年,代码激扬
  20. 2014美国大学计算机科学专业排名,2014年美国大学计算机科学专业排名.doc

热门文章

  1. VTK:直线网格之RectilinearGridToTetr​​ahedra
  2. VTK:绘图之PieChartActor
  3. QML识别模块identifiedmodules
  4. C++11 - sizeof用于类成员
  5. java关于包的叙述_Java中构造方法,包的引用,final,super等词的概括
  6. Scikit-learn——train_test_split()方法的功能和使用
  7. 4、Hive数据操作,DDL操作,CRUD database,CRUD table,partition,view,index,show命令等
  8. 3.关于QT中的MainWindow窗口,MenuBar,ToolBar,QuickTip等方面的知识点
  9. 2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效
  10. NetBean中的使用,比如快捷键