当前位置: 首页 > news >正文

java.io.Serializable引发的问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化?
 
 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
是对象永久化的一种机制。

   确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。

   只有序列化的对象才可以存储在存储设备上。为了对象的序列化而需要继承的接口也只是一个象征性的接口而已,也就是说继承这个接口说明这个对象可以被序列化了,没有其他的目的。之所以需要对象序列化,是因为有时候对象需要在网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把序列化的对象取出,然后通过网络传到客户端,再由客户端把序列化的对象读入内存,执行相应的处理。

   对象序列化是java的一个特征,通过该特征可以将对象写作一组字节码,当在其他位置读到这些字节码时,可以依此创建一个新的对象,而且新对象的状态与原对象完全相同。为了实现对象序列化,要求必须能够访问类的私有变量,从而保证对象状态能够正确的得以保存和恢复。相应的,对象序列化API能够在对象重建时,将这些值还原给私有的数据成员。这是对java语言访问权限的挑战。通常用在服务器客户端的对象交换上面,另外就是在本机的存储。

   对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口 。
*
Quote:


比较java.io.Externalizable和java.io.Serializable 
[URL]http://www.zdnet.com.cn/developer/code/story/0,3800066897,39304080,00.htm[/URL]

即使你没有用过对象序列化(serialization),你可能也知道它。但你是否知道 Java 还支持另外一种形式的对象持久化,外部化(externalization)?

下面是序列化和外部化在代码级的关联方式:

public interface Serializable {}

public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}

序列化和外部化的主要区别

外部化和序列化是实现同一目标的两种不同方法。下面让我们分析一下序列化和外部化之间的主要区别。

通过Serializable接口对对象序列化的支持是内建于核心 API 的,但是java.io.Externalizable的所有实现者必须提供读取和写出的实现。Java 已经具有了对序列化的内建支持,也就是说只要制作自己的类java.io.Serializable,Java 就会试图存储和重组你的对象。如果使用外部化,你就可以选择完全由自己完成读取和写出的工作,Java 对外部化所提供的唯一支持是接口:

voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)

现在如何实现readExternal() 和writeExternal() 就完全看你自己了。

序列化会自动存储必要的信息,用以反序列化被存储的实例,而外部化则只保存被存储的类的标识。当你通过java.io.Serializable接口序列化一个对象时,有关类的信息,比如它的属性和这些属性的类型,都与实例数据一起被存储起来。在选择走Externalizable这条路时,Java 只存储有关每个被存储类型的非常少的信息。

每个接口的优点和缺点

Serializable接口

· 优点:内建支持

· 优点:易于实现

· 缺点:占用空间过大

· 缺点:由于额外的开销导致速度变比较慢

Externalizable接口

· 优点:开销较少(程序员决定存储什么)

· 优点:可能的速度提升

· 缺点:虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上。

在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最简单的解决方案,但是它可能会导致出现不可接受的性能问题或空间问题;在出现这些问题的情况下,Externalizable可能是一条可行之路。

要记住一点,如果一个类是可外部化的(Externalizable),那么Externalizable方法将被用于序列化类的实例,即使这个类型提供了Serializable方法:

private void writeObject()
private void readObject() 
 

转载于:https://my.oschina.net/u/195267/blog/94941

相关文章:

  • oc之类排序
  • oKit项目管理软件正式提供在线服务
  • Red Hat 安装
  • 查看LoadRunner脚本请求日志和服务器返回值方法
  • iOS开发笔记 2、Cocoa简明
  • 烟花散尽漫说无(參考资料)
  • 我也谈谈《驳“永远不要对一个外行聊你的专业”【十全十美】》
  • iOS 界面 之 EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具...
  • windows 7 启用虚拟Wifi 热点网络只需3步搞定
  • hibernate将enum映射成int或varchar类型
  • 如果一个按钮被覆盖如何响应?
  • SEO优化的黑帽手法是否值得使用?
  • json.net处理复杂json
  • 各种***批处理
  • 链表 UVA 11988 Broken Keyboard (a.k.a. Beiju Text)
  • 分享的文章《人生如棋》
  • extract-text-webpack-plugin用法
  • JavaScript创建对象的四种方式
  • quasar-framework cnodejs社区
  • React as a UI Runtime(五、列表)
  • Webpack 4 学习01(基础配置)
  • 阿里云购买磁盘后挂载
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何合理的规划jvm性能调优
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 学习ES6 变量的解构赋值
  • 正则与JS中的正则
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • #在 README.md 中生成项目目录结构
  • (06)Hive——正则表达式
  • (1)(1.11) SiK Radio v2(一)
  • (C语言)fgets与fputs函数详解
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (四) 虚拟摄像头vivi体验
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET MVC 验证码
  • .net 按比例显示图片的缩略图
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • ::前边啥也没有
  • ?php echo ?,?php echo Hello world!;?
  • [100天算法】-x 的平方根(day 61)
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [JavaScript]如何讓IE9, IE8, IE7, IE6關閉視窗時不彈出對話訊息
  • [Linux] LVS+Keepalived高可用集群部署
  • [NOIP2014] 提高组 洛谷P1941 飞扬的小鸟
  • [Open3d]: 知识记录
  • [SoapUI] SoapUI学习视频地址
  • [svc]后台运行程序screen or nohup
  • [ZT]Dev-C++中编译C语言报错
  • [导入]视频游戏开发系列课程(3):游戏元素大观园.zip(10.69 MB)
  • [分类整理IV]微软等100题系列V0.1版:字符串+数组面试题集锦