简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!

如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问题吗?别急,其中一个最大的问题就是对象引用!举个例子来说:假如我有两个类,分别是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的对象相同"的标记,否则,保存该对象

通过以上的步骤序列化机制解决了对象引用的问题!

序列化的实现

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements

Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object

obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

修改默认的序列化机制

在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义时给它加上transient关键字即可,对于transient字段序列化机制会跳过不会将其写入文件,当然也不可被恢复。但有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类型,这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢?好在序列化机制为包含这种特殊问题的类提供了如下的方法定义:

private void readObject(ObjectInputStream in)

throws

IOException, ClassNotFoundException;

private void writeObject(ObjectOutputStream out)

throws

IOException;

(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)

使用以上方法我们可以手动对那些你又想序列化又不可以被序列化的数据字段进行写出和读入操作。之所以需要

象序列化

是因

候数据

象需要在网

传输

传输

候需要

将对

进行

序列化

从服

器存

储介质

上把序列化的

象取出

然后通

络传送

到客

再由客

端把序列化的

数据

入内存

行相

,重新将对象数据保存到本地

储介质,

然后

以文件的形式

呈现

这个流程就是:对象

〉序列化

〉传输

〉反序列化(重新

文件的形式

呈现)。

个人理解

序列化

相当

深度克隆

就是把你的

数据

化成二

制的

数据

,

方便

存和

象序列化后

才可以

保存在存

储介质

;反序列化使对象数据

以文件的形式

呈现

一个简单的Java序列化的例子

import   java.io.*;

import   java.util.*;

class   Data

implements   Serializable   {   //   实现序列话接口

private   int   n;

public   Data(int   n)   {   this.n   =   n;   }

public   String

toString()   {   return   Integer.toString(n);   }

}

public

class   Worm   implements   Serializable   {

public   static   void

main(String[]   args)

throws   ClassNotFoundException,   IOException

{   //   序列话读入和写入Object可能会有这两个异常

//   将你要序列化的object,保留到一个文件中

Random   rand   =   new   Random();

Data   d

=   new   Data(rand.nextInt(10));   //构建你需要序列话的Object

System.out.println("d   =   "   +   d);

ObjectOutputStream

out   =   new   ObjectOutputStream(

new

FileOutputStream("worm.out"));   //   准备写入的文件

out.writeObject(d);

out.flush();

out.close();   //   执行到这里你可以看见worm.out这个文件,

//

以下的代码读出你刚刚写入Object

ObjectInputStream   in   =   new

ObjectInputStream(

new   FileInputStream("worm.out"));   //

读你刚刚写入的文件

Data   d2   =   (Data)in.readObject();   //

重新构建你刚刚写入的Object

System.out.println("d2   =   "   +   d2);     }

}

分享到:

2009-01-17 13:19

浏览 2761

评论

java 序列化 例子_一个简单的Java序列化的例子相关推荐

  1. java年龄计算_一个简单的java年龄计算器

    制作一个如下图年龄计算器 根据题目,我做了一个由Calendar类以及年月日各相减得到的年龄,当然正确的方法不止一个,以下为我的源代码和结果截图: package com.Date; import j ...

  2. java 语言 写字板_一个简单的java语言写字板.docx

    一个简单的java语言写字板.docx 一个简单的JAVA语言写字板一.需求分析1.需求分析:现在网络上各种文档编辑器数不胜数.功能也是应有尽有,有能改变字体的,有可以改变字体颜色的,但是,这些软件有 ...

  3. java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...

    折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火.无奈之下自己撸了一个简单的任务调度器, ...

  4. java单机应用程序_一个简单的java桌面应用:单机版IFTTT

    1.项目背景: ifttt是"if this then that"的缩写,事实上是让你的网络行为能够引发连锁反应.让你使用更为方便.ifttt旨在帮助人们利用各网站的开放API,将 ...

  5. java仿真软件_一个简单的Java仿真程序

    这是一个简单的仿真程序: 在这个仿真程序中,花园委员会都希望了解每天通过大门进入公园的总人数.每个大门都有一个十字 转门或某种其他形式的计数器,并且任何一个十字转门的计数器递增时,就表示公园中的总人数 ...

  6. java应用开发_开发简单的Java应用

    第一章 开发简单的Java应用 1.Java语言的技术分类 (1)JavaSE:标准版,开发桌面应用 (2)JavaEE:企业版,Web应用 (3)JavaME:小型版,嵌入式 2.如何开发和运行Ja ...

  7. java笔试题_一道简单的 Java 笔试题,但值得很多人反思

    专注于Java领域优质技术,欢迎关注 作者:匿蟒 前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问 ...

  8. java时钟代码_一个经典的JAVA APPLET时钟程序(一)

    转眼间一年又要过了,自己又老了一岁,郁闷啊.趁着还有几分钟才新年,赶快再发几篇文章,给过去的一年添点东西. 该程序是从网上发现的,是一个简单的时钟显示程序. 代码特色: 时钟代码提供了各种接口,可以在 ...

  9. java断点续传原理_很简单的Java断点续传实现原理

    原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网 ...

最新文章

  1. 开启报名 | 青源 Salon 第 1 期:强化学习专场,报告,海报,激辩,这是年轻人的会场
  2. mysql dba系统学习(10)innodb引擎的redo log日志的原理
  3. win32 masm32 汇编学习 及 远程线程实例
  4. pixhawk软件架构
  5. POJ-1556 The Doors 线段相交+最短路
  6. 飞鸽传书人必须对自己守信
  7. html表格怎么设置浮动,html – 表格布局和浮动左和引导网格
  8. LocalDate,LocalDate,LocateDateTime的常用方法
  9. Android4开发入门经典 之 第四部分:用户界面
  10. 揭秘孙小小《PPT演示之道》
  11. Python学习日记之忽略删除字符串空白
  12. python模拟登录的实现
  13. 医药网订单对接ERP软件订单接口
  14. c语言大作业酒店管理系统,管理信息系统大作业《酒店管理系统》.doc
  15. 【推荐】2022年AIOT人工智能物联网行业研究报告市场应用分析白皮书(附件中为网盘地址,报告持续更新)
  16. A Game of Thrones(99)
  17. 老羊摘编自《罗辑思维跨年演讲》——分享3——阿里和腾讯
  18. 腾讯云容器团队内部Istio专题分享
  19. matlab画极坐标方程图像_怎么用matlab画极坐标图
  20. 一步步制作Arduino智能小车

热门文章

  1. Java利用Socket进行数据读写
  2. go post 参数_用 Go 编写能存数百万条记录仍非常快的缓存服务
  3. DPDK实战之skeleton(basicfwd)
  4. 0-3 Docker实用篇
  5. WiFi模组无线技术,物联网智能家居互联互通,无线WiFi技术连接设备
  6. 大浪淘沙后的电三轮市场,谁将“剩者为王”?
  7. 电力系统三相短路故障分析simulink仿真加报告
  8. 学术前沿趋势分析Task01
  9. 小红书增粉软件_小红书涨粉秘诀 小红书增粉软件
  10. Mac 自动化自动操作工作流程(Workflow)完成日常软件文件网页一键打开