有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想通过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'

我该如何解决这个问题


共 (2) 个答案

  1. # 1 楼答案

    使用base64将字节数组转换为字符串: JAVAutil。Base64。getEncoder()。encodeToString(字节[]src) JAVAutil。Base64。getDecoder()。解码(字符串src)

  2. # 2 楼答案

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

    无论如何,您似乎允许对序列化数据进行篡改,这是一个非常糟糕的主意,原因有很多