java基础序--列化和反序列化

Posted 爱,诗意永存

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础序--列化和反序列化相关的知识,希望对你有一定的参考价值。

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

  序列化:是指把java堆内存中的对象转换成字节(二进制流)的过程。也就是通过某种方式将java对象存储在磁盘内存中,这个过程称为序列化

  反序列化:是把磁盘上的对象转恢复成java对象的过程。

二、序列化和反序列化优点:

  1、分布式系统中,需要把对象在网络传输,需要将对象转换成二进制流形式,需要共享的javabean对象都需要进行序列化。

  2、服务器钝化,服务器发现某些对象好久没有活动,服务器就会将某些对象存储在本地内存中,需要的时候去内存中寻找,然后反序列化成java对象,节省服务器内存。

  总结:①、实现了数据的持久化,通过序列化保存在本地硬盘上。②、利用序列化实现了远程通信。

三、序列化的必要条件:

  1、需要实现Java.lang.Serializable 接口,java中大多类都实现类改接口。例:String Integer

  2、断层会判断,当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断

  3、jdk中的api:

  ObjectOutputStream 中的 writeObject() 方法进行序列化操作

  ObjectInputStream 中的readObject() 方法进行反序列化操作

 

  javabean 如果不实现 java.io.Serializable 接口

  

  demo:  

package com.liuxn.Serialization.javaBean;

import java.io.Serializable;

/**
 * Created by Administrator on 2018/6/13.
 * 创建一个javabean 实现 Serializable 接口
 */
public class User implements Serializable {

    //需要进行序列化的字段
    private String name;

    private int age;

    transient private String className;//不需要进行序列化的字段

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

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

//    public User(String name, int age) {
//        this.name = name;
//        this.age = age;
//    }
//
//
//    public User() {
//    }


    @Override
    public String toString() {
        return "User{" +
                "name=\'" + name + \'\\\'\' +
                ", age=" + age +
                ", className=\'" + className + \'\\\'\' +
                \'}\';
    }
}
package com.liuxn.Serialization.test;

import com.liuxn.Serialization.javaBean.User;

import java.io.*;

/**
 * Created by Administrator on 2018/6/13.
 *
 * 用于测试序列化和反序列化 测试类
 */
public class TestSerialization {

    public static void main(String[] args) {
        /**
         * 使用ObjectOutputStream实现序列化
         */
        User user = new User();
        user.setAge(10);
        user.setName("小明");
        System.out.println(user);

        ObjectOutputStream oos = null;
        try {
            OutputStream op = new FileOutputStream("F:\\\\360WiFi"+ File.separator+"a.txt");
            oos = new ObjectOutputStream(op);
            oos.writeObject(user);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         *  ObjectInputStream 实现反序列化
         */
        try {
            InputStream in = new FileInputStream("F:\\\\360WiFi"+ File.separator+"a.txt");
            ObjectInputStream os = new ObjectInputStream(in);
            byte[] buffer = new byte[10];
            int len = -1;
            User u = (User) os.readObject();
            System.out.println("反序列化:");
            System.out.println(u);
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

  

//输出结果:
User{name=\'小明\', age=10}
反序列化:User{name=\'小明\', age=10}

  在序列化时,如果javabean完成序列化后,修改javabean,在次进行反序列化会出现以下问题:

  解决:

  在javabean中条添加 serialVersionUID 固定版本。

  private static final long serialVersionUID = 1L;

 

 

 

  javabean 

以上是关于java基础序--列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

Java基础学习总结——Java对象的序列化和反序列化

Java基础学习总结——Java对象的序列化和反序列化

Java对象的序列化和反序列化

第五章:Python基础の何為生成器迭代器和序列化

Java零基础学习 Serializable - 序列化和反序列化

夯实Java基础系列22:一文读懂Java序列化和反序列化