序列化:将对象作为URL参数传递并提取值

时间:2013-07-19 10:32:51

标签: java serialization deserialization url-parameters

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

这就是我所做的:

在创建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'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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