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 字符流 字符 ...
随机推荐
- Access中的SELECT @@IDENTITY
在Access数据库中存在select @@identity吗?答案是肯定的.但是Access一次只能执行一条SQL,多条SQL需要多次执行,这是限制.在SQL Server中,可以一次执行多条SQL ...
- HTML写的第一个邮箱登陆界面
自己动手去写才会有收获,宁可模仿也不要全部复制粘贴 不说了,直接上代码.CSS有注释,适合新手. <!doctype html> <html> <head> < ...
- LAMP 搭建wordpress部署教程贴.
LAMP 搭建wordpress部署教程贴.这是一篇主要将LAMP,并且通过wordpress来进行验证,演示.如何去部署PHP CMS很多新手看到LAMP就很很头大,觉得很难搞,编译安装,搞了好几天 ...
- ie6下:png图片不透明 和 背景图片为png的节点的内部标签单击事件不响应
1.png图片不透明 少量图片时:使用滤镜: _background:none; _filter:prodig:DXImageTransform.Microsoft.AlphaImageLoader( ...
- angular json转义html
第一步json输出的内容反编码 function htmldecode(s){ var div = document.createElement('div'); div.innerHTML = s; ...
- phpquery笔记
下载phpquery包 require('phpQuery/phpQuery.php');//加载 for($i=1168;$i<=10000;$i++){ phpQuery::newDocum ...
- 兼容IE的渐变
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=, startColorstr=#1471da, endColorstr ...
- java实现双向链表
PS:双向链表(每个节点含有指向前一个节点的前驱与后一个节点的后继) public class DoublyLinkedList { static class Node { private Objec ...
- 使用Keil软件编写汇编源程序应注意事项
1)一定要使用微软的txt文本编辑器,否则键入逗号时编译通不过.应该是这个样('),不该是这个样(,). 2) 用数字做标号时,前面一定要加一个英文字母,否则编译通不过. 3) 有时编译通过的.asm ...
- list append 总是复制前面的参数,而不复制最后一个参数
append 总是复制前面的参数,而不复制最后一个参数 (define a1 '(1 2 3)) (define a2 '(a b c)) (define x (append a1 a2)) x ; ...