对象序列化(串行化)的作用、使用

来源:互联网 发布:网络爬虫工具 编辑:程序博客网 时间:2024/05/29 12:12

一、序列化的作用

序列化定义:将对象转换为二进制数据流(操作目标是对象)。
作用:方便传输及保存,可以帮开发者完成保存和读取对象成员变量取值的过程。

关键点:

1.一个类若想被序列化,则要实现java.io.serializable接口,该接口中没有定义任何方法,是一个标识符(maker interface),当一个类实现了该接口,表示该类是可以被序列化的。
2.在序列化时,static变量是无法序列化的;如果A包含了一个对B的引用,当A序列化的时候也将B一并的序列化;如果A可以序列化,B不可以序列化,则A序列化的时候将会发生异常,将B的引用设为transient,该关键字表示变量不会被序列化,这样A就可以被序列化了。static和transient关键字修饰的变量、引用不可以被序列化。
3.如果一个类可以被序列化,其子类也可以被序列化;因为子类也继承了serializable接口。

二、序列化使用方法
1.首先介绍两个用于序列化操作的类:ObjectlnputStream与ObjectOutputStream

(1)ObjectOutputStream(序列化)——将对象保存在文件之中

java.lang.Object  java.io.OutputStream      java.io.ObjectOutputStream

public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants
构造方法摘要protectedObjectOutputStream()            为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。 ObjectOutputStream(OutputStream out)            创建写入指定 OutputStream 的 ObjectOutputStream。
(2)ObjectlnputStream(反序列化)——从文件读取已保存的对象
java.lang.Object  java.io.InputStream      java.io.ObjectInputStream

public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants
构造方法摘要protected ObjectInputStream()
          为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。 ObjectInputStream(InputStream in)
          创建从指定 InputStream 读取的 ObjectInputStream。
2.序列化使用的读写方法

writeObject

public final void writeObject(Object obj)                       throws IOException
将指定的对象写入 ObjectOutputStream

readObject

public final Object readObject()                        throws IOException,                               ClassNotFoundException
从 ObjectInputStream 读取对象

3.序列化步骤

(1)步骤1——对象实现Serializable

示例:
class Person implements Serializable
{
private String name;
private int age;

public Person(String name,int age)
{
this.name = name;
this.age = age;
}

public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}

(2)步骤2——使用ObjectOutputStream对对象进行序列化(序列化的内容是输出

public static void serialize(File f) throws Exception
{
OutputStream out = FileOutputStream(f);
ObjectOutputStream obj = new ObjectOutputStream(out); //把输出流out进行序列化
obj.writeObject(new Person("张三",30));
obj.close();
}

(3)步骤3——使用ObjectInputStream对对象进行反序列化(反序列化的内容是输入

public static void deserialize(File f) throws Exception
{
InputStream in = new FileInputStreanm(f);
ObjectInputStream obj = new ObjectInputStream(in);
Person p = (Person)obj.readObject();
System.out.println(p.toString());
}


4.程序完整示例

import java.io.*;


class Person implements Serializable
{
private String name;
private int age;


public Person(String name,int age)
{
this.name = name;
this.age = age;
}


public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}


public class PrintDemo  
{
public static void main(String[] args) throws Exception
{
File f = new File("g:\\1.txt");
serialize(f);
deserialize(f);


}


public static void serialize(File f) throws Exception
{
OutputStream out = new FileOutputStream(f);
ObjectOutputStream obj = new ObjectOutputStream(out); //把输出流out进行序列化
obj.writeObject(new Person("张三",30));
obj.close();
}


public static void deserialize(File f) throws Exception
{
InputStream in = new FileInputStream(f);
ObjectInputStream obj = new ObjectInputStream(in);
Person p = (Person)obj.readObject();
System.out.println(p.toString());
}
}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生了孩子没奶怎么办 二年级孩子写作业慢怎么办 六年级下册数学解决问题差的怎么办 孩子五年级了学习成绩不好怎么办 孩子做错事不承认怎么办 二年级小孩拼音差怎么办 小学三年级数学60多分怎么办 孩子三年级了数学不开窍怎么办 初二数学太差该怎么办 孩子语文阅读理解能力差怎么办 5年级数学不开窍怎么办 一年级孩子数学不开窍怎么办 三年级孩子数学成绩差怎么办 孩子三年级数学太差怎么办 三年级孩子数学理解能力差怎么办 教小孩做作业老是发火怎么办 孩子拿笔重写字太黑怎么办 教小孩写不到汉字怎么办 一年级孩子数学理解能力差怎么办 小孩一年级数学学不好怎么办 孩子一年级数学学不好怎么办 小学一年级数学学不好怎么办 孩子一年级数学成绩不好怎么办 成绩差的孩子该怎么办 面对成绩差的孩子该怎么办 六年级数学成绩差该怎么办 孩子数学物理成绩差该怎么办 高三成绩很差该怎么办 孩子学习成绩差家长该怎么办 孩子一年级语文成绩不好怎么办 孩子上网成瘾不听父母话怎么办 10岁数学不开窍怎么办 孩子五年级数学不好怎么办 一岁宝宝难断奶怎么办 2岁宝宝断不了奶怎么办 快2岁宝宝不听话怎么办 2岁半的宝宝不听话怎么办 3岁宝宝哭闹不止怎么办 2岁宝宝爱打人怎么办 两周岁宝宝吃东西就吐怎么办 两周岁宝宝不爱吃饭怎么办