2013-07-19 71 views
0

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

我怎樣才能解決這個問題呢?

回答

0

UTF-8解碼不會將所有字節序列映射到字符上,因此您將丟失數據。您的網址參數可能無法應對所有字符。

在任何情況下,您似乎都允許序列化的數據被修改,由於多種原因,這是一個非常糟糕的主意。

+0

我試過沒有UTF-8,但沒有運氣。 –

+0

沒有UTF-8?在任何默認的字符集恰好在運行?不太可能好得多。您需要使用Base64或類似軟件對其進行編碼。 –

1

使用BASE64的字節數組轉換爲字符串:。 java.util.Base64.getEncoder()encodeToString(字節[] SRC) java.util.Base64.getDecoder()進行解碼(字符串SRC)

相關問題