0

我想通过 URL 参数传递对象,通过序列化将其转换为字符串,然后通过反序列化获取对象。

这是我所做的:

在 URL 参数创建期间:

SerializationUtils.getAsString(localMarketHomeDTO.getPointInTime()); //serializing it

在提取值期间:

SerializationUtils.getAsObject(paramValue.toString(),Class.forName("java.util.Date")); //deserializing it

这里localMarketHomeDTO.getPointInTime()是类型java.util.Date

课程SerializationUtils是:

public class SerializationUtils{

    private SerializationUtils(){

    }

    public static <T extends Serializable> String getAsString(T object) throws Exception {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(object);
        objectOutputStream.flush();
        return byteArrayOutputStream.toString("UTF-8");
    }

    public static <T> T getAsObject(String string, Class<T> clazz) throws Exception {
        byte[] byteArray = string.getBytes("UTF-8");
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        T object = clazz.cast(objectInputStream.readObject());
        return object;
    }
}

但我有例外:

'java.util.Date; local class incompatible: stream classdesc serialVersionUID = 7523895402267505689, local class serialVersionUID = 7523967970034938905' due to 'java.io.InvalidClassException: java.util.Date; local class incompatible: stream classdesc serialVersionUID = 7523895402267505689, local class serialVersionUID = 7523967970034938905'

我该如何解决这个问题?

4

2 回答 2

1

使用 base64 将字节数组转换为字符串: java.util.Base64.getEncoder().encodeToString(byte[] src) java.util.Base64.getDecoder().decode(String src)

于 2015-11-06T18:27:12.640 回答
0

UTF-8 解码不会将所有字节序列映射到字符上,因此您将丢失数据。您的 URL 参数也可能无法处理所有字符。

在任何情况下,您似乎都允许篡改序列化数据,出于多种原因,这是一个非常糟糕的主意。

于 2013-07-19T11:09:00.997 回答