我目前正在開發一個Web應用程序,並且我想讓java對象在服務器上保持持久性,以便隨時可以檢索它們。由於數據庫對於我的應用程序來說是一種矯枉過正,我選擇了持久化java對象的最簡單方法:序列化爲xml或字節。不幸的是,我使用的代碼的很大一部分是我不能修改的java類,這些類不實現接口「可序列化」。我有什麼關於序列化這些類的對象以及我自己的類的其他交互對象的選項?非序列化第三方類的Java序列化
0
A
回答
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?謝謝! –
相關問題
- 1. Json.NET自定義序列化/第三方類型的反序列化
- 2. 如何使用Jackson序列化/反序列化第三方Java對象
- 3. MsgPack第三方對象序列化
- 4. Java:如何序列化第三方庫生成的Java對象?
- 5. Java序列與非序列化部分
- 6. JAVA:是否有可能序列化與私有字段不可序列化的第三方類?
- 7. Can Django序列化程序序列化非Django類/對象
- 8. 序列化VS非序列化類的屬性
- 9. 序列化類型爲Type的非序列化對象?
- 10. Java「的方法序列化」
- 11. 在第三方庫中擴展序列化類型
- 12. 使用KRYO非序列化到序列化類屬性
- 13. java序列化和反序列化
- 14. Android序列化 - java反序列化
- 15. Java序列化與.NET序列化
- 16. Java序列化
- 17. Java序列化
- 18. Java序列化
- 19. 如何序列化第三方不可序列化的最終課程(例如,谷歌的LatLng類)?
- 20. 序列化/反序列化派生類
- 21. java序列化 - 持久化類定義
- 22. 的Java序列化
- 23. 的Java序列化
- 24. Java。序列化的陣列
- 25. 用Jackson正確序列化和反序列化Java類
- 26. 將Java序列化對象反序列化爲Scala類
- 27. 如何使用protobuf-net或其他序列化器序列化第三方類型?
- 28. 簡單的XML序列化的第三方庫
- 29. 從第三方庫類(newtonsoft)實現自定義Json序列化程序
- 30. 從第三方DLL反序列化二進制序列化實例給出未初始化/空實例
如果你可以繼承子類並在子類中實現Serializable,那麼你就可以做到了。另一種方法是實現自定義的方式來自己序列化它們。你的問題有點太寬泛,無法在這裏回答。但是作爲一個簡短的例子:如果Path始終被同一臺機器反序列化,則Path可以被串行化爲一個String。也請理解,諸如java.io.Stream之類不能被序列化。你必須找到一種方法讓你的代碼從別的東西上重新創建一個Stream。 –
我認爲我的解決方案是通過提供自己的Serializable接口的writeObject和readObject方法的實現來實現自定義的序列化對象的方式。你會如何建議包裝原來的第三方課?通過擴展這個類或者創建一個新的類來引用第三方類的對象? –
我會去接口'串行器'這將提出兩個方法:Serializable toSerializable(T objectToSerialize)和'T fromSerializable(Serializable serializedObject)'爲每個需要serialiaze的類使用唯一的Serializable類。然後將所有序列化程序包裝在SerializationService/Factory中,該程序可以從中找到路徑。因此,你只需要在你的不可序列化的類和你的序列化文件之間有一箇中間層(DAO)。 –