Java中的序列化和反序列化

java对象序列化是指将java对象转换为字节序列的过程,而反序列化则是将字节序列转换为java对象的过程。
我们知道,不同进程/程序间进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等,
而这些数据都会以二进制序列的形式在网络上传送。
那么java对象不能直接传输,就需要转换为二进制序列传输,所以要序列化。
java中序列化和反序列化的方式:|
首先要序列化的类必须实现接口java.io.Serializable。这个接口中没有具体的方法,只是标记该类可以序列化,实现了这个接口就会要求添加一-个serialVersionUID的版本号。这个版本号的作用是在反序列化时用来验证两个进程;
中是否使用了同一个类。
java中的序列化是通过ObjectQutputStream类的writeObject()方法将对象直接写出。
反序列化是通过ObjectInputStream类的readObject()从流中读取对象。

需要说明的是,如果你只使用一个Java程序是无法模拟这个过程的,我们上面也说了,序列化问题的出现离不开二进制流传输。

我们来复现一些这个过程,我们使用本机的redis和一个SpringBoot程序来完成。
先定义一个用于传输的类。

import java.io.Serializable;
public class MyUser  implements Serializable{
    private static final long serialVersionUID = 121L;
    private int age;
    private String name;

    public MyUser() {
    }

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

    @Override
    public String toString() {
        return "MyUser{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

SpringBoot程序代码


@RestController
public class redis {
    @GetMapping("/list")
    public void list() throws Exception {
        Jedis jedis = new Jedis("127.0.0.1" , 6379 , 1000); // redis 的连接
        MyUser user = new MyUser(20,"张辉");
        
        //这里我们使用jedis将user对象存储到redis中
        //注意user对象如果没有实现Serializable就会抛出异常
        //这也证实了我们上面说的,只要用于传输的对象就必须要实现Serializable
     	
        jedis.set("userzzzzzzzzzzzzzzzz".getBytes(), serialize(user));
        
        byte[] byt=jedis.get("userzzzzzzzzzzzzzzzz".getBytes());
		//此过程为反序列化过程,我们把user对象存储到redis以后,可以将
		//jedis.set("userzzzzzzzzzzzzzzzz".getBytes(), serialize(user));
		//这一行代码注释掉然后修改一下serialVersionUID,然后重启,再从redis中读取
		//这时候我们就可以发现serialVersionUID 的作用,就是标识流的ID
		//如果不一样JVM会认为这是两个不同的对象,那么我要吗?
		//我肯定不要啊,对象都不一样我还反序列化你干嘛
		
        MyUser obj= (MyUser) unserizlize(byt);

        System.out.println(obj.toString());
    }
    //序列化
    public static byte [] serialize(Object obj) throws Exception {
        ByteArrayOutputStream bai = null;
        ObjectOutputStream obi = null;
        try {
            bai=new ByteArrayOutputStream();
            obi=new ObjectOutputStream(bai);
            obi.writeObject(obj);
            return bai.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(obi!=null){
                obi.close();
            }
            if(bai!=null){
                bai.close();
            }
        }
        return null;
    }

    //反序列化
    public static Object unserizlize(byte[] byt) throws Exception {
        ObjectInputStream oii=null;
        ByteArrayInputStream bis=null;
        try {
            bis=new ByteArrayInputStream(byt);
            oii=new ObjectInputStream(bis);
            return oii.readObject();
        } catch (Exception e) {

            e.printStackTrace();
        }finally {
            if(oii!=null){
                oii.close();
            }
            if(bis!=null){
                bis.close();
            }
        }
        return null;
    }
}

你可能感兴趣的:(Java,网络)