本章目标:

理解什么是Serializable(序列化)
了解Serializable(序列化)原理
多对象Serializable(序列化)的实现
Clone

  

1.什么是序列化?什么是反序列化?

序列化: 把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。

  

2.为什么需要序列化?

在当今的网络社会,我们需要在网络上传输各种类型的数据,包括文本、图片、音频、视频等,
而这些数据都是以二进制序列的形式在网络上传送的,那么发送方就需要将这些数据序列化为字节流后传输,
而接收方接到字节流后需要反序列化为相应的数据类型。当然接收方也可以将接收到的字节流存储到磁盘中,等到以后想恢复的时候再恢复。

 

3.对象的序列化和反序列化主要有两种用途:

把对象的字节序列永久地保存到磁盘上。(持久化对象)
可以将Java对象以字节序列的方式在网络中传输。(网络传输对象)

 

4.如何序列化和反序列化?

如果要让某个对象支持序列化机制,则其类必须实现下面这两个接口中任一个。

Serializable

public interface Serializable {
}
1
Externalizable

public interface Externalizable extends java.io.Serializable {
   void writeExternal(ObjectOutput out) throws IOException;
   void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
 }

 

5.实现Serializable接口

如果是对序列化的需求非常简单,没有对序列化过程控制的需求,可以简单实现Serializable接口即可。
从Serializable的源码可知,其是一个标记接口,无需实现任何方法。例如我们有如下的Student类

    public class Student implements Serializable {  
        private String name;
        private int age;

        public Student(String name,int age)
        {
            System.out.println("有参数构造器执行");
            this.name=name;
            this.age=age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

 

6.序列化: 那么我们如何将此类的对象序列化后保存到磁盘上呢?

创建一个 ObjectOutputStream 输出流oos
调用此输出流oos的writeObject()方法
private static void serializ()
{
    try (ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("object.txt"));)
    {
       Student s=new Student("ben",18);
       oos.writeObject(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

7.反序列化:我们如从文本文件中将此对象的字节序列恢复成Student对象呢?

创建一个ObjectInputStream 输入流ois
调用此输入流ois的readObject()方法。

 private static void deSerializ()
 {
     try(ObjectInputStream ois=new ObjectInputStream(new FileInputStream("object.txt"));)
     {
         Student s= (Student) ois.readObject();
         System.out.println(s.toString());
     }catch (Exception e)
     {
         e.printStackTrace();
     }
 }

 

8.版本 serialVersionUID

由于反序列化Java对象的时候,必须提供该对象的class文件,但是随着项目的升级class文件文件也会升级,Java如何保证兼容性呢?

答案就是 serialVersionUID。每个可以序列化的类里面都会存在一个serialVersionUID,只要这个值前后一致,即使类升级了,

系统仍然会认为他们是同一版本。如果我们不显式指定一个,系统就会使用默认值。

 

9.心得

苦与乐,是冤家,也是亲家。最大的欢乐,往往包含在巨大的艰辛之中。犹如明珠藏于大海,宝藏埋于深山。
花儿不为谁开,也可以为自己开,世界不为谁存在,也可以为自己存在。
一个人对于苦乐的看法并不是一定,也不是永久的。许多当年深以为苦的事,现在想起来却充满了快乐。

 

posted on 2020-09-05 09:30  仙女的日常  阅读(135)  评论(0编辑  收藏  举报