【问题标题】:java.io.InvalidClassException: serialization from string to object fail javajava.io.InvalidClassException:从字符串到对象的序列化失败java
【发布时间】:2014-05-10 03:15:03
【问题描述】:

我有一个名为 Doodle 的对象,我将它序列化为一个字符串,这没关系。 当我尝试反序列化对象时出现问题,错误是: java.io.InvalidClassException:java.util.ArrayList;本地类不兼容:stream classdesc serialVersionUID = 8664875232659988799,本地类serialVersionUID = 8683452581122892189

序列化和反序列化的方法如下:

public static String serDoodle(Doodle dood){
    String serializzato = null;
    try {
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream so = new ObjectOutputStream(bo);
        so.writeObject(dood);
        so.flush();
        serializzato = bo.toString();
        so.close();
        bo.close();
    } catch (Exception e) {
        System.out.println(e);

    }
    return serializzato;

}
public static Doodle deserDoodle(String deserializza){
    Doodle dod = new Doodle();


    try {
        byte[] b = deserializza.getBytes(); 
        ByteArrayInputStream bi = new ByteArrayInputStream(b);
        ObjectInputStream si = new ObjectInputStream(bi);
        dod=(Doodle) si.readObject();
        si.readObject().getClass();
        si.close();
        bi.close();
    } catch (Exception e) {
        System.out.println("deserDoodle "+e);

    }
    return dod;


}

我使用相同的方法(但使用不同的变量)来序列化另一种类型的对象,并且使用该方法可以很好地工作。 不明白哪里出了问题!

【问题讨论】:

    标签: java serialization serialversionuid


    【解决方案1】:

    我序列化成String就可以了

    不,这不好。 String 不是二进制数据的容器。 byte-array 和String 之间的往返不能保证是损失。不要这样做。使用byte[],或至少对其进行Base64 编码。

    【讨论】:

    • 所以你这么说,字符串越长会丢失更多数据?
    • @user3457185 像往常一样回答“你这么说”的问题,我什么也没说。我说不能使用String 作为二进制数据的容器。时期。它与长度无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多