kryo实现序列化至硬盘与从硬盘反序列

1.依赖

<!--序列化工具包-->
    <dependency>
      <groupId>com.esotericsoftware</groupId>
      <artifactId>kryo</artifactId>
      <version>4.0.2</version>
    </dependency>

2.工具类

/**
     * 序列化至硬盘
     * @param filePath  序列化路径
     * @param list      带序列号列表
     * @param <T>       泛型
     */
    public static <T> void serializeObject(String filePath, List<T> list) {

        if (CollectionUtils.isEmpty(list)) {
            LOGGER.warn("没有要待序列化的东西");
        }

        Kryo kryo = new Kryo();
        kryo.setReferences(false);
        kryo.setRegistrationRequired(false);
        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());

        Output output = null;
        try {
            Path path = Paths.get(filePath);
            if (Files.notExists(path)) {
                Files.createFile(path);
            }
            output = new Output(new FileOutputStream(filePath));
            T t = list.get(0);
            kryo.register(t.getClass());
            kryo.writeObject(output, t);

            for (int i = 1; i < list.size(); i++) {
                T instance = list.get(i);
                kryo.writeObject(output, instance);
            }
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.warn(e.getMessage(), e.fillInStackTrace());
        } finally {
            if (output != null) {
                output.close();
            }
        }
    }

    /**
     * 反序列化至类
     * @param filePath  序列化文件路径
     * @param clazz     反序列化class类名
     * @param <T>       泛型
     * @return          反序列化后的类
     */
    public static <T>List<T> deserializeObject(String filePath,Class<T> clazz) {
        Path path = Paths.get(filePath);
        if (Files.notExists(path) || Files.isDirectory(path)) {
            LOGGER.warn("反序列化文件不存在,或不是文件");
            return null;
        }
        if(clazz == null){
            LOGGER.warn("反序列化的类为null");
            return null;
        }

        List<T> list = Lists.newArrayList();
        Kryo kryo = new Kryo();
        kryo.setReferences(false);
        kryo.setRegistrationRequired(false);
        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());
        Input input = null;
        try {
            T t;
            input = new Input(new FileInputStream(filePath),10240);
            while (input.canReadInt()){
                t = kryo.readObject(input,clazz);
                list.add(t);
            }
        }catch (IOException e){
            e.printStackTrace();
            LOGGER.error(e.getMessage(),e.fillInStackTrace());
        }finally {
            if(input != null){
                input.close();
            }
        }

        return list;
    }

3.测试:

class Demo{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public static void main(String[] args) {
        List<Demo> demoList = Lists.newArrayList();
        for (int i = 0; i < 10; i++) {
            Demo demo = new Demo("name"+i,i);
            demoList.add(demo);
        }
        serializeObject("d:\\test.bin",demoList);

        List<Demo> deserialize = deserializeObject("d:\\test.bin", Demo.class);
        if(CollectionUtils.isNotEmpty(deserialize)){
            for (Demo demo :deserialize) {
                System.out.println(demo);
            }
        }
    }

4.结果展示:

Demo{name='name0', age=0}
Demo{name='name1', age=1}
Demo{name='name2', age=2}
Demo{name='name3', age=3}
Demo{name='name4', age=4}
Demo{name='name5', age=5}
Demo{name='name6', age=6}
Demo{name='name7', age=7}
Demo{name='name8', age=8}
Demo{name='name9', age=9}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值