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

Java深度历险(十)——Java对象序列化与RMI

对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中。JVM停止之后,这些状态就丢失了。在很多情况下,对象的内部状态是需要被持久化下来的。提到持久化,最直接的做法是保存到文件系统或是数据库之中。这种做法一般涉及到自定义存储格式以及繁琐的数据转换。对象关系映射(Object-relational mapping)是一种典型的用关系数据库来持久化对象的方式,也存在很多直接存储对象的对象数据库。对象序列化机制(object serialization)是Java语言内建的一种对象持久化方式,可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。除了可以很简单的实现持久化之外,序列化机制的另外一个重要用途是在远程方法调用中,用来对开发人员屏蔽底层实现细节。

基本的对象序列化

由于Java提供了良好的默认支持,实现基本的对象序列化是件比较简单的事。待序列化的Java类只需要实现Serializable接口即可。Serializable仅是一个标记接口,并不包含任何需要实现的具体方法。实现该接口只是为了声明该Java类的对象是可以被序列化的。实际的序列化和反序列化工作是通过ObjectOuputStream和ObjectInputStream来完成的。ObjectOutputStream的writeObject方法可以把一个Java对象写入到流中,ObjectInputStream的readObject方法可以从流中读取一个Java对象。在写入和读取的时候,虽然用的参数或返回值是单个对象,但实际上操纵的是一个对象图,包括该对象所引用的其它对象,以及这些对象所引用的另外的对象。Java会自动帮你遍历对象图并逐个序列化。除了对象之外,Java中的基本类型和数组也是可以通过 ObjectOutputStream和ObjectInputStream来序列化的。

try {
    User user = new User("Alex", "Cheng");
    ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("user.bin"));
    output.writeObject(user);
    output.close();
} catch (IOException e) {
    e.printStackTrace();
}
 
try {
    ObjectInputStream input = new ObjectInputStream(new FileInputStream("user.bin"));
    User user = (User) input.readObject();
    System.out.println(user);
} catch (Exception e) {
    e.printStackTrace();
} 
 

上面的代码给出了典型的把Java对象序列化之后保存到磁盘上,以及从磁盘上读取的基本方式。 User类只是声明了实现Serializable接口。

 

在默认的序列化实现中,Java对象中的非静态和非瞬时域都会被包括进来,而与域的可见性声明没有关系。这可能会导致某些不应该出现的域被包含在序列化之后的字节数组中,比如密码等隐私信息。由于Java对象序列化之后的格式是固定的,其它人可以很容易的从中分析出其中的各种信息。对于这种情况,一种解决办法是把域声明为瞬时的,即使用transient关键词。另外一种做法是添加一个serialPersistentFields? 域来声明序列化时要包含的域。从这里可以看到在Java序列化机制中的这种仅在书面层次上定义的契约。声明序列化的域必须使用固定的名称和类型。在后面还可以看到其它类似这样的契约。虽然Serializable只是一个标记接口,但它其实是包含有不少隐含的要求。下面的代码给出了 serialPersistentFields的声明示例,即只有firstName这个域是要被序列化的。

private static final ObjectStreamField[] serialPersistentFields = { 
    new ObjectStreamField("firstName", String.class) 
};  

自定义对象序列化

基本的对象序列化机制让开发人员可以在包含哪些域上进行定制。如果想对序列化的过程进行更加细粒度的控制,就需要在类中添加writeObject和对应的 readObject方法。这两个方法属于前面提到的序列化机制的隐含契约的一部分。在通过ObjectOutputStream的 writeObject方法写入对象的时候,如果这个对象的类中定义了writeObject方法,就会调用该方法,并把当前 ObjectOutputStream对象作为参数传递进去。writeObject方法中一般会包含自定义的序列化逻辑,比如在写入之前修改域的值,或是写入额外的数据等。对于writeObject中添加的逻辑,在对应的readObject中都需要反转过来,与之对应。

 

转自http://www.infoq.com/cn/articles/cf-java-object-serialization-rmi

转载于:https://www.cnblogs.com/rockding/p/3443518.html

相关文章:

  • Codeforces Round #215 (Div. 2) 解题报告
  • CGI Internal Server Error
  • Symantec终止售卖SIM产品
  • (11)MATLAB PCA+SVM 人脸识别
  • C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码
  • Windows Phone 8初学者开发—第6部分:设置应用程序的样式
  • VHD_Update_diskpart
  • mysql乱码问题解决办法
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • 动态定义二维数组的方法
  • Data Domain虚拟带库(VTL)的部署和实施
  • 在VMM2012R2中使用二代虚拟机创建的模板无法创建虚拟机的解决方法
  • C#获取url中参数键值对的方法
  • 零点起飞学HTML+CSS
  • linux下-scp不需要密码,简历相互信任关系
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【comparator, comparable】小总结
  • Android优雅地处理按钮重复点击
  • C语言笔记(第一章:C语言编程)
  • emacs初体验
  • gulp 教程
  • If…else
  • iOS小技巧之UIImagePickerController实现头像选择
  • Linux快速复制或删除大量小文件
  • mysql中InnoDB引擎中页的概念
  • Odoo domain写法及运用
  • Spring Cloud Feign的两种使用姿势
  • springMvc学习笔记(2)
  • vue数据传递--我有特殊的实现技巧
  • Wamp集成环境 添加PHP的新版本
  • 排序算法之--选择排序
  • 前端工程化(Gulp、Webpack)-webpack
  • 微信开放平台全网发布【失败】的几点排查方法
  • 在Mac OS X上安装 Ruby运行环境
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # Java NIO(一)FileChannel
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (done) 两个矩阵 “相似” 是什么意思?
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (算法二)滑动窗口
  • (转)http-server应用
  • (转)Scala的“=”符号简介
  • (转)visual stdio 书签功能介绍
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET 材料检测系统崩溃分析
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作