日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

克隆可序列化和不可序列化的Java对象

發布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 克隆可序列化和不可序列化的Java对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
開發人員經常依靠3d方庫來避免重新發明輪子,尤其是在Java世界中,Apache和Spring這樣的項目如此盛行。 在處理這些框架時,我們通常很少或根本無法控制其類的行為。

這有時會導致問題。 例如,如果您想深度克隆不提供合適克隆方法的對象,除了編寫大量代碼之外,您還有什么選擇?

通過序列化克隆

最簡單的方法是通過利用對象可序列化進行克隆。 Apache Commons提供了一種執行此操作的方法,但是出于完整性考慮,下面也將自己編寫代碼。

@SuppressWarnings("unchecked") public static T cloneThroughSerialize(T t) throws Exception {ByteArrayOutputStream bos = new ByteArrayOutputStream();serializeToOutputStream(t, bos);byte[] bytes = bos.toByteArray();ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));return (T)ois.readObject(); }private static void serializeToOutputStream(Serializable ser, OutputStream os)throws IOException {ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(os);oos.writeObject(ser);oos.flush();} finally {oos.close();} }// using our custom method Object cloned = cloneThroughSerialize (someObject);// or with Apache Commons cloned = org.apache.commons.lang. SerializationUtils.clone(someObject);

但是,如果我們要克隆的類不是可序列化的,并且我們無法控制源代碼或者無法將其設置為可序列化的,該怎么辦?

選項1 – Java深度克隆庫

有一個不錯的小程序庫,它可以深度克隆幾乎所有Java對象- 克隆 。 它利用Java的出色反射功能來提供優化的對象的深克隆版本。

Cloner cloner=new Cloner(); Object cloned = cloner.deepClone(someObject);

如您所見,它非常簡單有效,并且需要最少的代碼。 除了這個簡單的示例,它還具有一些更高級的功能,您可以在此處查看 。

選項2 – JSON克隆

如果我們無法在我們的代碼庫中引入新的庫該怎么辦? 我們中的一些人處理批準程序以引入新的庫,對于一個簡單的用例,可能不值得。

好吧,只要我們有某種方式可以序列化和還原對象,就可以制作一個深層副本。 JSON通常被使用,因此它是一個很好的選擇,因為我們大多數人都使用一個或另一個JSON庫。

Java中的大多數JSON庫都可以有效地序列化任何POJO,而無需任何配置或映射。 這意味著,如果您具有JSON庫并且不能或不會引入更多庫來提供深度克隆,則可以利用現有的JSON庫來獲得相同的效果。 請注意,此方法將比其他方法慢,但是對于絕大多數應用程序,這不會引起任何性能問題。

以下是使用GSON庫的示例。

@SuppressWarnings("unchecked") public static T cloneThroughJson(T t) {Gson gson = new Gson();String json = gson.toJson(t);return (T) gson.fromJson(json, t.getClass()); } // ... Object cloned = cloneThroughJson(someObject);

請注意,僅當復制的對象具有默認的無參數構造函數時,這才可能起作用。 對于GSON,您可以使用實例創建者來解決此問題。 其他框架也有類似的概念,因此如果遇到無法修改的類且沒有默認構造函數的問題,可以使用它。


結論

我建議做的一件事是,對于需要克隆的任何類,都應該添加一些單元測試,以確保一切正常。 這樣可以防止對類的更改(例如,升級庫版本)在您不知情的情況下破壞應用程序,尤其是在您設置了持續集成環境的情況下。

我概述了幾種在沒有任何自定義代碼的情況下克隆對象的方法。 如果您使用其他任何方法獲得相同的結果,請分享。

參考: Carfey Software Blog上的JCG合作伙伴 Craig Flichel從Java輕松深度克隆了Java中的可序列化和不可序列化的對象 。

相關文章 :

  • Java最佳實踐–高性能序列化
  • 使用Gson教程進行Android JSON解析
  • 將JSON功能添加到您的GWT應用程序中
  • Java 7功能概述
  • Java Code Geeks編寫的Java示例和代碼段–正式發布

翻譯自: https://www.javacodegeeks.com/2011/12/cloning-of-serializable-and-non.html

總結

以上是生活随笔為你收集整理的克隆可序列化和不可序列化的Java对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。