Java学习笔记——IO操作之对象序列化及反序列化
对象序列化的概念
对象序列化使得一个程序可以把一个完整的对象写到一个字节流里面;其逆过程则是从一个字节流里面读出一个事先存储在里面的完整的对象,称为对象的反序列化。
将一个对象保存到永久存储设备上称为持续性。对象的序列化即可实现持续性。
一个对象要想能够实现序列化,必须实现 Serializable 接口或 Externalizable 接口。
对象序列化的作用
一、对象序列化可以实现分布式对象。主要应用例如:RMI(远程方法调用)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二、对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
对象序列化的相关说明
一、如果某个类能够被序列化,其子类也可以被序列化。
二、声明为 static和transient 类型的成员数据不能被序列化。因为 static 代表类的状态, transient 代表对象的临时数据。
三、当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。
四、如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。
五、如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。
对象序列化的Java实现代码
我们以实现Serializable接口来为例来进行相关操作。
先定义一个类 Person:
class Person implements Serializable {
private static final long serialVersionUID = 1L;
int age;
String name;
static int i = 100;
transient int k = 2;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void m1(){
System.out.println(age + "-" + name + "-" + i + "-" + k);
}
}
对象序列化的实现:
Java方法代码
//序列化(串行化)
public static void ser(Person p, String fileName){
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(new File(fileName)));
oos.writeObject(p);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
实现范例
public static void main(String[] args) {
Person p = new Person();
p.age = 100;
p.name = "007";
String fileName = "obj.txt";
ser(p,fileName);
}
如此,可以在项目目录下生成 obj.txt。即完成了对象的序列化。
对象反序列化的实现:
Java 方法代码:
//反序列化(并行化)
public static void unSer(String fileName){
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(fileName)));
Person p = (Person)ois.readObject();
System.out.println(p.getAge() + p.getName());
p.m1();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
实现范例
为了验证对象反序列化的实现,我们将与对象序列化有关的代码注释掉。
public static void main(String[] args) {
// Person p = new Person();
// p.age = 100;
// p.name = "007";
String fileName = "obj.txt";
// ser(p,fileName);
unSer(fileName);
}
输出如下:
---------- 运行 ----------
100007
100-007-100-0
输出完成 (耗时 0 秒) - 正常终止
则证明我们对象反序列化成功。
Java学习笔记——IO操作之对象序列化及反序列化的更多相关文章
- Java学习笔记——IO操作之以图片地址下载图片
以图片地址下载图片 读取给定图片文件的内容,用FileInputStream public static byte[] mReaderPicture(String filePath) { byte[] ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- Java 学习笔记 IO流与File操作
可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件 读文件示例代码 File file = new File("D:\\test\\t.txt" ...
- 第12讲-Java中的IO操作及对象的序列化与反序列化
1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1 io操作 1.2.2 对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...
- Java开发笔记(九十)对象序列化及其读写
有些时候,开发者想把程序运行过程中的数据临时保存到文件,可是前面介绍的字符流和字节流,要么用来读写文本字符串,要么用来读写字节数组,并不能直接保存某个对象信息,因为对象里面包括成员属性和成员方法,单就 ...
- java学习笔记--IO流
第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...
- Java学习笔记-IO
IO(Input Output)流,用来处理设备之间的数据传输 IO IO概述 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按操作数据分为两种:字节流与字符流 流按流向 ...
- java学习笔记——IO流部分
IO流常用的有:字符流.字节流.缓冲流.序列化.RandomAccessFile类等,以上列出的都是开发中比较常用的. 1.字节流: 字节流包含:FileInputStream/FileOutputS ...
- java学习笔记 --- IO(2)
IO流的分类: 流向: 输入流 读取数据 输出流 写出数据 数据类型: 字节流 字节输入流 读取数据 InputStream 字节输出流 写出数据 OutputStream 字符流 字符 ...
随机推荐
- (转) CS0234: 命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Ajax”(是否缺少程序集引用?)
从SVN上down下来的程序,编译报了一大堆的错,发现是缺少引用,但是明明引用了,后来打开引用,发现system.web.mvc这个引用打着叹号,如图, 后来重新引用了本机的system.web.mv ...
- Aspose.Cells for .NET 8.5.0 工具类
基于 Aspose.Cells for .NET 8.5.0 工具类, Aspose.Cells for .NET 8.5.0 这个自己去CSDN下载里面有破解的,没有破解的导出excel的时候会(A ...
- js获取当前的时间(包含星期)
<script type="text/javascript"> setInterval("www_zzje_net.innerHTML=new ...
- ORA-01810格式代码出现两次 的解决方案
今早做一个查询页面时,需要查询两个时间区间的跨度,使用TO_DATE函数,一开始写成了Sql代码 TO_DATE('2014-08-04 00:00:00','YYYY-MM-DD HH:mm:ss' ...
- .NET定时发送邮件
添加一个全局应用程序类Global.asax 代码会在访问网站时运行 Global.asax代码: void Application_Start(object sender, EventArgs e) ...
- poj2187 Beauty Contest(旋转卡壳)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Beauty Contest Time Limit: 3000MS Memor ...
- cmd编译运行Java文件详解
①准备工作 首先用记事本编写HelloWorld.java放至G:\Javaspace路径 public class HelloWorld{ public static void main(Strin ...
- MongoDB在win7下安装配置
1.在MongoDB官网下载最新版本,并且安装 2.解压后在MongoDB文件目录下创建data文件夹和log文件夹,并且在log文件夹中新建mongodb.log文件 3.新建一个配置文件mongo ...
- js formatString 格式化字符串
/* 函数:格式化字符串 参数:str:字符串模板: data:数据 调用方式:formatString("api/values/{id}/{name}",{id:101,name ...
- 关于qq创始人----马化腾的一些琐事
马化腾(pony)写代码的水平如何? 一位产品经理吐槽: 曾经和pony一起写过代码. 当时5个人挤在一个只有四个位置的房间里,埋头开发,用C++.我当时负责写一个通讯模块,有一个bug弄了两天,没有 ...