编程进阶:Java小白的序列化Serializable接口

在之前的学习过程中,我们知道了如何使用FileInputStream输入流和FileOutputStream输出流编写程序读写文件。

下面我们来学习一下如何使用序列化和反序列化读写文件。

一、序列化

1.什么是序列化?

序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保持或传输格式的过程。

在序列化过程中,会将对象的公有成员、私有成员(包括类名),转换为字节流,然后再把字节流写入数据流,存储到存储介质中,这里说的存储介质通常指文件。

序列化后的对象保存的是二进制状态,这样实现了平台无关性,通过反序列化得到对象,而无需担心数据因平台问题而显示异常。

2.使用序列化保存对象信息

序列化机制允许将实现序列化的Java对象转换为字节序列,这个过程需要借助I/O流来实现。

只有实现了java.io.Serializable接口的类的对象才能被序列化,Serializable表示可串行的,可序列化的(串行化)。

JDK中如String类、包装类和Date类等,都实现了Serializable接口。

二、反序列化

使用反序列化获取对象信息:1.创建一个对象输出流(ObjectInputStream),它可以包装一个其它类型的输入流。2.通过对象输入流的readObject()方法读取对象,该方法返回一个object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成其真实的类型。
 1 import java.io.FileNotFoundException;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.ObjectOutputStream;
 5
 6 import bdqn.filedemo.Student;
 7
 8 /**
 9  * 用序列化保存对象信息:
10  * 1.创建一个对象输出流(ObjectOutputStream),它可以包装一个其它类型的输出流。
11  * 2.通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象。
12  * @author Administrator
13  *
14  */
15 public class SerializableObj {
16 /**
17  * 使用序列化将学生对象保存到文件中,实现步骤如下:
18  * 1.创建学生类,实现Serializable接口
19  * 2.引入相关类
20  * 3.创建对象输出流
21  * 4.调用writeObject()方法将对象写入文件
22  * 5.关闭对象输出流
23  * @param args
24  */
25     public static void main(String[] args) {
26         ObjectOutputStream oos = null;
27         try {
28             //创建ObjectOutputStream输出流
29             oos = new ObjectOutputStream(new FileOutputStream("D:\\tengyicheng\\stu.txt"));
30             Student stu = new Student("安娜",28,"女");
31             //对象序列化,写入输出流
32             oos.writeObject(stu);
33             System.out.println("录入成功!");
34         } catch (FileNotFoundException e) {
35             e.printStackTrace();
36         } catch (IOException e) {
37             e.printStackTrace();
38         }
39         finally{
40             if (oos!=null) {
41                 try {
42                     oos.close();
43                 } catch (IOException e) {
44                     e.printStackTrace();
45                 }
46             }
47         }
48
49     }
50
51 }
 1 import java.io.FileInputStream;
 2 import java.io.IOException;
 3 import java.io.ObjectInputStream;
 4
 5 import bdqn.filedemo.Student;
 6
 7 /**
 8  * 使用反序列化获取对象信息:
 9  * 1.创建一个对象输出流(ObjectInputStream),它可以包装一个其它类型的输入流。
10  * 2.通过对象输入流的readObject()方法读取对象,该方法返回一个object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成其真实的类型。
11  * @author Administrator
12  *
13  */
14 public class DeSerializableObj {
15
16 /**
17  * 使用反序列化读取文件中的学生对象:
18  * 1.引入相关类
19  * 2.创建对象输入流
20  * 3.调用readObject()方法读取对象
21  * 4.关闭对象输入流。
22  * @param args
23  */
24     public static void main(String[] args) {
25         ObjectInputStream ois = null;
26         try {
27             //创建ObjectInputStream输入流
28             ois = new ObjectInputStream(new FileInputStream("D:\\tengyicheng\\stu.txt"));
29             Student object = (Student)ois.readObject();
30             System.out.println("姓名:"+object.getName());
31             System.out.println("年龄:"+object.getAge());
32             System.out.println("性别:"+object.getSex());
33         } catch (Exception e) {
34             e.printStackTrace();
35         }
36         finally{
37             if (ois!=null) {
38                 try {
39                     ois.close();
40                 } catch (IOException e) {
41                     e.printStackTrace();
42                 }
43             }
44         }
45
46     }
47
48 }
 1 import java.io.FileNotFoundException;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.ObjectOutputStream;
 5 import java.util.LinkedList;
 6 import java.util.List;
 7
 8 import bdqn.filedemo.Student;
 9
10 /**
11  * 序列化一组对象
12  * @author Administrator
13  *
14  */
15 public class SerializableList {
16
17     public static void main(String[] args) {
18         ObjectOutputStream oos = null;
19         //创建一组学生对象
20         Student stu1 = new Student("李小冉",28,"女");
21         Student stu2 = new Student("赵丽颖",28,"女");
22         Student stu3 = new Student("胡歌",32,"男");
23         Student stu4 = new Student("王凯",35,"男");
24         //创建一组列表保存
25         List<Student> list = new LinkedList<Student>();
26         list.add(stu1);
27         list.add(stu2);
28         list.add(stu3);
29         list.add(stu4);
30         //创建对象输出流
31         try {
32             oos = new ObjectOutputStream(new FileOutputStream("D:\\tengyicheng\\stu1.txt"));
33             //写入输出流
34             oos.writeObject(list);
35         } catch (FileNotFoundException e) {
36             e.printStackTrace();
37         } catch (IOException e) {
38             e.printStackTrace();
39         }
40         finally{
41             if (oos!=null) {
42                 try {
43                     oos.close();
44                 } catch (IOException e) {
45                     e.printStackTrace();
46                 }
47             }
48         }
49
50     }
51
52 }
 1 import java.io.FileInputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.IOException;
 4 import java.io.ObjectInputStream;
 5 import java.util.LinkedList;
 6 import java.util.List;
 7
 8 import bdqn.filedemo.Student;
 9
10 /**
11  * 反序列化读取一组对象
12  * @author Administrator
13  *
14  */
15 public class DeSerializableList {
16
17     public static void main(String[] args) {
18         ObjectInputStream ois = null;
19         try {
20             //创建对象输入流
21             ois = new ObjectInputStream(new FileInputStream("D:\\tengyicheng\\stu1.txt"));
22             //读取对象
23             @SuppressWarnings("unchecked")
24             List<Student> stus = (LinkedList<Student>)ois.readObject();
25             for (Student stu : stus) {
26                 System.out.println("姓名:"+stu.getName());
27                 System.out.println("年龄:"+stu.getAge());
28                 System.out.println("性别:"+stu.getSex());
29             }
30         } catch (FileNotFoundException e) {
31             e.printStackTrace();
32         } catch (ClassNotFoundException e) {
33             e.printStackTrace();
34         } catch (IOException e) {
35             e.printStackTrace();
36         }
37         finally{
38             if (ois!=null) {
39                 try {
40                     ois.close();
41                 } catch (IOException e) {
42                     e.printStackTrace();
43                 }
44             }
45         }
46
47     }
48
49 }
时间: 2024-11-08 23:45:40

编程进阶:Java小白的序列化Serializable接口的相关文章

Java 的序列化Serializable接口介绍及应用

常看到类中有一串很长的 如 private static final long serialVersionUID = -4667619549931154146L;的数字声明.这些其实是对此类进行序列化的,那为何要进行序列化呢?下面参照网络及jdk说明,进行学习一下: 理解: serialVersionUID 用来表明类的不同版本间的兼容性 简单的说,Java的序列化是通过在运行时判断类的serialversionUID来验证版本的一致性的.在进行序列化时,jvm会把传来的字节流中的serialv

序列化Serializable接口

一.序列化 1.什么是序列化? 序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保持或传输格式的过程. 在序列化过程中,会将对象的公有成员.私有成员(包括类名),转换为字节流,然后再把字节流写入数据流,存储到存储介质中,这里说的存储介质通常指文件. 序列化后的对象保存的是二进制状态,这样实现了平台无关性,通过反序列化得到对象,而无需担心数据因平台问题而显示异常. 2.使用序列化保存对象信息 序列化机制允许将实现序列化的Java对象转换为字节序列,这个过程需要借助I/O流

【java】对象序列化Serializable

1 package 对象序列化; 2 3 import java.io.Serializable; 4 5 @SuppressWarnings("serial") 6 class A implements Serializable{ 7 8 } 9 public class TestSerializable { 10 public static void main(String[] args) { 11 12 } 13 } 对象序列化:java.io.ObjectOutputStrea

面试题:Java中对象序列化接口(Serializable)的意义

Serializable接口是一个里面什么都没有的接口 它的源代码是public interface Serializable{},即什么都没有. 如果一个接口里面什么内容都没有,那么这个接口是一个标识接口,比如,一个学生遇到一个问题,排错排了几天也没解决,此时,她举手了(示意我去帮他解决),然后我过去,帮他解决了,那么这个举手其实就是一个标识,自己不能解决的问题标示我去帮他解决,在Java中的这个Serializable接口是给JVM看的,告诉JVM,我不做这个类的序列化了,你(JVM)给我序

Java Serializable接口(序列化)理解及自定义序列化

  1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化).serialization 不但可以在本机做,而且可以经由网络操作.它自动屏蔽了操作系统的差异,字节顺序等.比如,在 Windows 平台生成一个对象并序列化之,然后通过网络传到一台 Unix 机器上,然后可以在这台Unix机器上正确地重构(deserialization)这个对象. 不必

Java序列化接口Serializable接口的作用总结

转载 http://www.cnblogs.com/DreamDrive/p/4005966.html 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了.(存储到硬盘是一个文件,不需要我们去解析,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管. 我们只需要读取). 把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.

Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口

方法一: 实现Serializable接口,这个我就不多说了 方法二: 实现Externalizable接口: 例子: package demo; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; public class XXS implements Externalizable{ private String n

Java对象序列化原理以及Serializable接口

Java对象的序列化就是把一个对象变成二进制的数据流的一中方法,通过对象的序列化可以方便的实现对象的传输和存储. 原理是:对象------------->转换----------------->将对象转变为二进制的数据 在对象序列化时,只有其属性被序列化(每个对象都具备相同的方法,但是每个对象的属性不一定相同,也就是说对象保存的只有其属性信息) 那么一个类的对象要被序列化,这该类就必须实现java.io.Serializable接口,其源码如下: public interface Serial

Java中的Serializable接口的作用

转载自:http://blog.csdn.net/shehun11/article/details/40300439 所谓的Serializable,就是java提供的通用数据保存和读取的接口.至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了.这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方.也可以用管道来传输到系统的其他程序中.这样子极大的简化了类的设计.只要设计一个保存一个读取功能就能解决上面说得所有问题. Obj