Java的默认序列化

懒驴 2021年12月03日 81次浏览

Java默认序列化

Java序列化是在JDK1.1中引入的。是Java内核的重要特性之一。如果希望一个类对象是可序列化的,要做的就是实现Serializable 接口。Java的Serializable是一个标记接口,不需要实现任何字段和方法。
如下例的为Serializable接口的源码:

package java.io;

public interface Serializable {
}

这就像是一种选择性加入处理,通过它可以使类对象成为可序列化的对象。序列化处理是由**ObjectInputStream、ObjectOutputStream **实现的,因为我们需要做的是基于它们进行一层封装,要么将其保存为文件,要么将其通过网络发送。
下面是一个简单的序列化实例,User 对象类:

package com.study;

import java.io.Serializable;

/***
 * 用户类
 */
public class User implements Serializable {
    private static final long serialVersionUID = 6790721269925597540L;
    public User(){}

    private Long userId;
    private String userName;

    /*** 此处省略get set方法和更多的类属性 ***/
    @Override
    public String toString(){
        return "User{" +
                "userId=" +userId+
                ", userName='" +userName+
                "'}";
    }

}


自定义序列化接口

下面我来自定义一个序列化接口ISerializer

package com.study.inter;

/***
 * 自定义的序列化接口
 */
public interface ISerializer {
    /** 1.对象序列化 **/
    <T> byte[] serialize(T obj);

    /** 2.对象反序列化 **/
    <T> T deserialize(byte[] data, Class<T> clazz);

    /** 3.将对象序列化到文件中 **/
    <T> void serializeToFile(T obj, String fileName);

    /** 4.从文件中反序列化成对象 **/
    <T> T deserializeFromFile(String fileName, Class<T> clazz);

}

自定义实现序列化

编写自定义序列化类 JavaSerializer,实现上面的ISerializer接口,同时实现方法:

package com.study.inter.impl;

import com.study.inter.ISerializer;

import java.io.*;

/***
 * 自定义序列化实现
 */
public class JavaSerializer implements ISerializer {

    /** 1.对象序列化 **/
    @Override
    public <T> byte[] serialize(T obj) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try{
            ObjectOutputStream outs = new ObjectOutputStream(baos);
            outs.writeObject(obj);
            outs.close();
        }catch (Exception e){
            throw new RuntimeException();
        }
        return baos.toByteArray();
    }

    /** 2.对象反序列化 **/
    @Override
    public <T> T deserialize(byte[] data, Class<T> clazz) {
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        try{
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (T) ois.readObject();
        }catch (Exception e){
            throw new RuntimeException();
        }
    }

    /** 3.将对象序列化到文件中 **/
    @Override
    public <T> void serializeToFile(T obj, String fileName) {
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try{
            fos = new FileOutputStream(fileName);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(obj);
            oos.close();
            fos.close();
        }catch (Exception e){
            throw new RuntimeException();
        }
    }

    /** 4.从文件中反序列化成对象 **/
    @Override
    public <T> T deserializeFromFile(String fileName, Class<T> clazz) {
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        try{
            fis = new FileInputStream(fileName);
            ois = new ObjectInputStream(fis);
            return (T)ois.readObject();
        }catch (Exception e){
            throw new RuntimeException();
        }
    }
}


编写测试程序

编写测试类TestSerialize 类:

package com.study.test;

import com.study.User;
import com.study.inter.impl.JavaSerializer;

import java.util.Arrays;

/***
 * 序列化测试程序
 */
public class TestSerialize {
    public static void main(String[] args) {
        User user=new User();
        user.setUserId(1001L);
        user.setUserName("懒驴博客");

        JavaSerializer javaSerializer=new JavaSerializer();

        //1.序列化
        byte[] userBytes = javaSerializer.serialize(user);
        System.out.println("user对象序列化的结果是:" + Arrays.toString(userBytes));

        //2.反序列化
        User deserializeUser=javaSerializer.deserialize(userBytes, User.class);
        System.out.println("反序列化后的结果是:"+deserializeUser.toString());

        //3.序列化到文件
        javaSerializer.serializeToFile(user, "D:\\tmp.out");

        //4.从文件中反序列化
        User serializeFromFileUser = javaSerializer.deserializeFromFile("D:\\tmp.out", User.class);
        System.out.println("从文件在序列化的结果为:"+serializeFromFileUser);

    }
}

运行结果:

测试类的运行结果
测试类的运行结果
注意:文件中的乱码是没有转码的原因,详细内容后续粘贴出来。