序列化 - 在程序包重命名后失败

时间:2016-11-29 07:35:22

标签: java serialization

Appended是我用于序列化对象的小实用程序函数。我刚遇到以下问题:

我重命名了一个软件包,突然在打开我的应用程序并尝试读取序列化数据时我得到java.lang.ClassCastException ...

我可以以某种方式解决这个问题吗?我希望我的序列化在重命名后工作,我能做些什么来实现这个吗?通过一些版本控制,例如?

以下是我目前使用的两个简单函数:

public static String serialize(Object object)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try
    {
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
        oos.close();
    } catch (IOException e)
    {
        L.e(StringUtil.class, e);
    }
    return Base64.encodeToString(baos.toByteArray(), 0);
}

public static <T> T deserialize(String serializedObject, Class<T> clazz)
{
    if (serializedObject == null)
        return (T)null;

    byte [] data = Base64.decode(serializedObject, 0);
    Object o = null;
    try
    {
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
        o = ois.readObject();
        ois.close();
    }
    catch (IOException e)
    {
        L.e(StringUtil.class, e);
    }
    catch (ClassNotFoundException e) {
        L.e(StringUtil.class, e);
    }

    return (T)o;
}

1 个答案:

答案 0 :(得分:0)

我可以建议下一个选项:

  • 添加对deserialize方法的支持,以处理旧的包名称
    • byte [] data转换为字符串
    • 使用反序列化数据中的新替换旧包名(使用regexp)
    • 继续使用ObjectInputStream反序列化