Java I/O - 对象的输入输出与序列化

Posted jing-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java I/O - 对象的输入输出与序列化相关的知识,希望对你有一定的参考价值。

先说概念:

序列化是Java提供的一种将对象写入到输出流、并在之后将其读回的机制。

序列化:把内存中的java对象转换成与平台无关的二进制字节序列,以便永久保存在磁盘上或通过网络进行传输。

 

Java提供的对对象进行读写的流对象(即承载对象的媒介)为ObjectOutputStream 和 ObjectInputStream ,它们的作用就是把对象转换为字节序列,并承载这些序列,并提供了writeObject() 和 readObject() 方法对这些字节序列进行读写。

那么,如何实现对象的序列化与反序列化呢?

方法(一)

1、实现Serializable接口

如果某个类对象要被序列化,该类必须实现Serializable接口,只接口内无具体方法,所以只需要声明实现该接口,而无需实现具体方法。

public class Student implements Serializable { 
    …… }

2、通过ObjectOutputStream 类对象的writeObject(obj)方法,将obj参数指定的对象进行序列化,把得到的字节序列写到目标输出流中。

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("student.dat"));
        Student s = new Student();
        out.writeObject(s);
        out.close();

3、通过ObjInputStream类对象的readObject()方法从源输入流中读取字节序列,再反序列化为对象,并将其返回。

        //反序列化得到对象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("student.dat"));
        Student s1 = (Student) in.readObject();
        in.close();

以上是简单的对象序列化,会将对象的全部域都进行序列化,有时候对象的一些数据域只在本地有意义,对这样的数据进行序列化后存储或传输没有意义,甚至有时会在反序列化后使用对象时引起崩溃。所以,我们需要指定一些字段不需要序列化。

自定义序列化的字段

方法(一)使用transient关键字

在对未来会进行序列化的类进行定义时,使用transient关键字修饰无需序列化的字段。

方法(二)

方法(三)实现Externalizable接口

使用

 

 

 

 

如何实现序列化?

 

 

 

容易理解,序列化就是为了对对象进行

 

以上是关于Java I/O - 对象的输入输出与序列化的主要内容,如果未能解决你的问题,请参考以下文章

Java I/O - 输入/输出流

Java 输入输出——流

浅谈Java中流的概念与用途

Java中输入输出(续篇)

java—— IO 输入流输出流

Java输入输出流