2017-02-21 122 views
0

我目前正在開發一個Web應用程序,並且我想讓java對象在服務器上保持持久性,以便隨時可以檢索它們。由於數據庫對於我的應用程序來說是一種矯枉過正,我選擇了持久化java對象的最簡單方法:序列化爲xml或字節。不幸的是,我使用的代碼的很大一部分是我不能修改的java類,這些類不實現接口「可序列化」。我有什麼關於序列化這些類的對象以及我自己的類的其他交互對象的選項?非序列化第三方類的Java序列化

+1

如果你可以繼承子類並在子類中實現Serializable,那麼你就可以做到了。另一種方法是實現自定義的方式來自己序列化它們。你的問題有點太寬泛,無法在這裏回答。但是作爲一個簡短的例子:如果Path始終被同一臺機器反序列化,則Path可以被串行化爲一個String。也請理解,諸如java.io.Stream之類不能被序列化。你必須找到一種方法讓你的代碼從別的東西上重新創建一個Stream。 –

+0

我認爲我的解決方案是通過提供自己的Serializable接口的writeObject和readObject方法的實現來實現自定義的序列化對象的方式。你會如何建議包裝原來的第三方課?通過擴展這個類或者創建一個新的類來引用第三方類的對象? –

+0

我會去接口'串行器'這將提出兩個方法:Serializable toSerializable(T objectToSerialize)和'T fromSerializable(Serializable serializedObject)'爲每個需要serialiaze的類使用唯一的Serializable類。然後將所有序列化程序包裝在SerializationService/Factory中,該程序可以從中找到路徑。因此,你只需要在你的不可序列化的類和你的序列化文件之間有一箇中間層(DAO)。 –

回答

1

正如我在我的評論中所說的,我會去找一個SerializationService,它會爲您想要保存的每個對象找到合適的Serializer<T>

喜歡的東西:

public interface Serializer<T> { 

Serializable toSerializable(T objectToSerialize); 

//to build a factory/service around it 
boolean canDeserialize(Serializable serializedObject); 

T fromSerializable(Serializable serializedObject); 

}

如果你想有一個基本的,具體的例子:有相當常見路徑:

public class PathSerializer implements Serializer<Path> { 

@Override 
public Serializable toSerializable(Path objectToSerialize) { 
    return objectToSerialize.toString(); 
} 

@Override 
public Path fromSerializable(Serializable serializedObject) { 
    if(!canDeserialize(serializedObject)){ 
     throw new IllegalArgumentException("Cannot deserialize this"); 
    } 
    return Paths.get((String)serializedObject); 
} 

@Override 
public boolean canDeserialize(Serializable serializedObject) { 
    return serializedObject != null && serializedObject instanceof String; 
} 

}

你可以還很好地存儲POJO,其中包含您的原始對象類和參數列表的名稱ters需要在其構造函數和/或其領域的地圖能夠通過反射重新生成您的對象。

這完全取決於您和您的應用程序的複雜性。

0

我認爲JSON將是這裏的解決方案。以Googles GSON庫爲例。你不需要來註釋類,只需編寫

Gson gson = new Gson(); 
MyObj obj = gson.fromJson(jsonString); 
String json = gson.toJson(obj); 

有關JSON格式見official JSON documentation的一般信息。

0

一種選擇是擴展你無權訪問的類,以便保存它們的內部狀態,並對這些類實現Serializable。

在這太問題更多信息: Serializing a class variable which does not implement serializable

除此之外,我不認爲這是除了建立一些包裝和手動序列化類XML或JSON任何其他選項。

+0

你能給我一個包裝類的代碼示例嗎?這個手冊serizalization?謝謝! –