Java list 反序列化不同包结构的问题记录

Java list 反序列化不同包结构的问题记录

网上百度的序列化反序列化list方法:

    List<PictureVO> pictureVOList = new ArrayList<>();
   System.out.println("^^^^^^^^^^^^序列化^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
   //输出内容到本地F:\\test33.txt
        File file = new File("F:\\test33.txt");
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file))) {
            PictureVO[] obj = new PictureVO[pictureVOList.size()];
            pictureVOList.toArray(obj);
            out.writeObject(obj);
        }catch (IOException e) {
            e.printStackTrace();
        }


        pictureVOList.forEach(System.out::println);

        System.out.println("^^^^^^^^^^^^^^^^^^反序列化^^^^^^^^^^^^^^^^^^^^^^^^^");
        File deserialization = new File("F:\\test.txt");
        try(ObjectInputStream in = new ObjectInputStream(new FileInputStream(deserialization))){
            PictureVO[] o = (PictureVO[]) in.readObject();
            List<PictureVO> picList = Arrays.asList(o);
            picList.forEach(System.out::println);
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }

上面这个在同一包结构下是可以的,但是在别的工程项目反序列化的时候是会报错的
百度找解决办法是: 继承ObjectInputStream 然后Override resolveClass方法

package com.qlk.importpic.model.Helper;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;

public class MyObjectInputStream extends ObjectInputStream {
    private static final String OLD_PACKAGE = "com.qlk.goods";
    private static final String NEW_PACKAGE = "com.qlk.importpic";

    public MyObjectInputStream(InputStream arg0) throws IOException {
        super(arg0);
    }

    @Override
    public Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
        String name = desc.getName();
        try {
            if (name.startsWith(OLD_PACKAGE)) {
                name = name.replace(OLD_PACKAGE, NEW_PACKAGE);
                return Class.forName(name);
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return super.resolveClass(desc);
    }
}

然后然后,我用了后还是报错。。。
报错说:找不到对应的类。

最后搞了好久,尝试了好多次,发现坑点在这里》》
序列化的时候要把list先转成 JSONObject.toJSONString(pictureVOList)
本项目的json是使用
import com.alibaba.fastjson.JSONObject;

    JSONObject.toJSONString(pictureVOList)
  System.out.println("^^^^^^^^^^^^序列化^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
   //输出内容到本地F:\\test55.txt
  File file = new File("F:\\test55.txt");
        try( ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));) {
            objectOutputStream.writeObject(JSONObject.toJSONString(pictureVOList));
        }catch (IOException e) {
            e.printStackTrace();
        }

总结本次问题:

  1. 序列化对象要 implements Serializable
    并且serialVersionUID 要相同
    private static final long serialVersionUID = 7247075966127792198L;
  1. 不同工程项目中反序列化,如果包的结构不同会报找不到对应的类的错误,解决办法是,继承ObjectInputStream 然后Override resolveClass方法
  2. 如果重写还报错,可能是序列化的问题,切记切记。序列化也要处理好。
展开阅读全文
©️2020 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值