zoukankan      html  css  js  c++  java
  • 序列化

    本章目标:

    理解什么是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.心得

    苦与乐,是冤家,也是亲家。最大的欢乐,往往包含在巨大的艰辛之中。犹如明珠藏于大海,宝藏埋于深山。
    花儿不为谁开,也可以为自己开,世界不为谁存在,也可以为自己存在。
    一个人对于苦乐的看法并不是一定,也不是永久的。许多当年深以为苦的事,现在想起来却充满了快乐。
  • 相关阅读:
    计算机三级数据库-指导
    spring导入约束
    hibernater获取session时org.hibernate.service.spi.ServiceException错误
    springxml配置注入报错
    右键复制类的完整路径
    关于实体里的toString方法
    idea创建web项目环境
    框架快速找类
    如何在scdn博客里搜索自己博客文章
    永久消除自动产生的QQPCMgr
  • 原文地址:https://www.cnblogs.com/www-tty-com/p/13612240.html
Copyright © 2011-2022 走看看