IO基础(序列化和反序列化)

偏执的太偏执、 2023-07-10 05:27 127阅读 0赞

IO基础(序列化和反序列化)

文章目录

    • IO基础(序列化和反序列化)
    • 一、什么是序列化和反序列化
    • 二、什么时候需要序列
    • 三、如何实现序列化
    • 四、序列化和反序列化总结

一、什么是序列化和反序列化

对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象

这种机制就是使用一个字节序列表示一个对象, 该字节序列包含:对象的类型。对象的数据和对象中存储的属性等信息字节序列写到文件之后,相当于文件中持久保存了一个对象的信息

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

要实现序列化和反序列化就要使用对象序列化流和对象反序列化流:
●对象序列化流: ObjectOutputStream
●对象反序列化流: ObjectinputStream

二、什么时候需要序列

1、把内存中的对象状态保存到一个文件中或者数据库中时候;
2、 用套接字在网络上传送对象的时候

三、如何实现序列化

对象序列化/反序列化的前提是对象的类要实现Serializable接口.
Serialiable 接口是一个标志接口,没有任何成员.就是告诉编译器可以进行序列化.

一般情况下,类实现了Serializable 接口后,要手动的添加一个序列化版本号字段:

公共类person类 测试序列化和反序列化

  1. import java.io.Serializable;
  2. /**
  3. * 描述:person类 测试序列化和反序列化
  4. */
  5. public class Person implements Serializable {
  6. private static final long serialVersionUID = 1L;
  7. private String name;
  8. @Override
  9. public String toString() {
  10. return "Person{" +
  11. "name='" + name + '\'' +
  12. '}';
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public Person(String name) {
  21. this.name = name;
  22. }
  23. }

对象序列化流: ObjectOutputStream

●将Java对象的原始数据类型和图形写入OutputStream, 可以使用ObjectlnputStream读取 (重构)对象。可以通过使用流的文件来实现对象的特久存储。如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象

构造方法:

●ObjectOutputStream(OutputStreamout):
创建一个写入指定的Outputstrearm的ObjectOutputStrearm序列化对象的方法:

●. void writeObject(Object obj): 将指定的对象写入ObjectOutputStream

序列化测试类代码如下:

  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectOutputStream;
  5. /**
  6. * 描述:把Person类进行序列化
  7. */
  8. public class Test {
  9. public static void main(String[] args) throws Exception {
  10. serializePerson();
  11. }
  12. /**
  13. * 序列化
  14. */
  15. private static void serializePerson() throws IOException {
  16. Person person = new Person("123");
  17. // ObjectOutputStream 对象输出流
  18. // person.txt 文件中,完成对 person 对象的序列化操作
  19. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("test01\\person.txt")));
  20. oos.writeObject(person);
  21. System.out.println("person 对象序列化成功!");
  22. oos.close();
  23. }
  24. }

对象反序列化流: ObjectinputStream

使用ObjectnputStream进行反字列化,简单的理解为把文件中的对象读取出来

反序列化对象的方法:
●ObjectreadObject(): 从ObjectnputStream读取 一个对象

进行反序列化测试代码:

  1. import java.io.*;
  2. /**
  3. * 描述:进行反序列化
  4. */
  5. public class Test {
  6. public static void main(String[] args) throws Exception {
  7. Person person = deserializePerson();
  8. System.out.println(person.toString());
  9. }
  10. /**
  11. * 反序列化
  12. */
  13. private static Person deserializePerson() throws Exception {
  14. ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("e:/person.txt")));
  15. Person person = (Person) ois.readObject();
  16. System.out.println("person 对象反序列化成功!");
  17. return person;
  18. }
  19. }

四、序列化和反序列化总结

1、一个类如果想被序列化,那么需要实现一个Serializable接口。
2、类中的静态变量的值是不会被进行序列化的,transient 修饰的属性,是不会被序列化的,内置类型 为对应0值。引用类型为null;用transient关键字标记的成员变量不参与序列化过程。

3、在实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值,最好设置为1L,这 个L最好大写来区分,不然小写看起来像是1,不同的 serialVersionUID 的值,会影响到反序列化

发表评论

表情:
评论列表 (有 0 条评论,127人围观)

还没有评论,来说两句吧...

相关阅读

    相关 序列序列

      互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同

    相关 序列序列

    序列化和反序列化   摘要   序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没

    相关 序列序列

    个人学习理解 (只是自己默写序列化和反序列的代码以及几个问题) 1.序列化 和 反序列化 1.1 什么是序列化 和 反序列化 或者 你如何理解序列化和

    相关 序列序列

    序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进