Java序列化(Serialization)的理解
生活随笔
收集整理的這篇文章主要介紹了
Java序列化(Serialization)的理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
1、什么是序列化
Java是面向對象的編程語言,有時需要保存對象,并在下次使用時可以順利還原該對象。由于這種需求很常見,所以Java API對此提供了支持,添加相關程序代碼到標準類庫中,并將保存和還原的過程稱之為“對象序列化”。Java SE7 文檔中將與對象序列化的相關內容做了詳細表述,將其稱為:
“Java對象序列化規范” ?Java Object Serialization Specification,網址為:
http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html
2、為什么叫序列化
個人猜測:由于保存對象的過程,是把對象保存為一連串字節流,而英文Serialization的意思“序列化”,所以序列化形象的表述了這個過程。
3、序列化保存那些內容
對象(object)是類(class)的一個實例(instance)。一個類中包含了變量(field)和函數(method)兩個部分。同一個類的不同對象只是變量不同,所以Java API序列化過程中只保存了對象的變量部分。同樣,由于靜態變量(static field)是由同一個類的各個對象共用的,所以序列化過程中也不保存。由于還原對象時需要在程序中動態創建該對象,所以程序也需要知道該對象的類定義,所以如果對象由一個程序序列化保存之后,由另外一個程序反序列化還原時,類文件也需要傳送給該程序。這就需要擴展Java API序列化的功能,對其進行自定義。Java的遠程方法調用(Remote Method Invocation, RMI)功能,就是以Java API序列化為基礎,并進行了擴展。
3、序列化的用途
序列化主要有三個用途:- 對象持久化(persistence)
如果通過序列化功能,將對象保存到文件中,就可以延長對象的存在時間,在下次程序運行是再恢復該對象。
序列化將對象保存在文件中,是實現對象持久化的一種方式。持久化還有很多種方式,比如Hibernate框架就提供了一整套對象持久化的方案。
- 對象復制
- 對象傳輸
4、什么是流(Stream)
Java是面向對象的編程語言,對象是對現實實體的抽象表述。所以Java API中流(Stream)是對一連串數據的抽象,同時定義了一些操作,write和read等。所以現實實體,只要包含數據和對數據的讀寫操作都可以表示為流。OutputStream類和InputStream類,是2個抽象類,分別對應輸出、輸入流,所有其它流對象,都是其子類。比如文件,文件本質是保存在存儲設備中的一連串數據,在Java API中抽象為FileOutputStream類和FileInputStream類,文件的讀寫可以通過對相應流的讀寫實現的。
比如控制臺中命令和結果的輸入輸出,鍵盤的輸入是一串數據,程序的輸出是一串數據,所以在Java API中也被抽象為流對象??刂婆_輸入由System.in對象體現,System.in是類型為InputStream的對象??刂婆_輸出由System.out對象體現,System.out是類型為PrintStream的對象。
由于文件和控制臺輸入輸出都和操作系統有關,所以文件流和控制臺流對象最終都是由Java虛擬機創建的。
ByteArrayOutputStream、ByteArrayInputStream,是完全不依賴Java虛擬機的流對象,其完全是對一個byte[]數組的抽象。因為byte[]數組也是一連串數據,byte[]數組支持讀寫功能,所以完全可以抽象為流對象,這可以從這兩個類的源代碼中看出。
4、使用序列化功能
在Java API中,對象序列化接口主要由兩個類提供:ObjectOutputStream,ObjectInputStream。為了滿足保存到文件、內存、通過網絡傳輸等不同需求,對象序列化后保存在流對象中。提供不同的流對象時,序列化后保存在相應流對象中。比如提供FileOutputStream和FileInputStream,就保存在文件中;提供ByteArrayOutputStream、ByteArrayInputStream,就保存在內存中。
由于Java API已經提供了實現序列化需要的相關代碼,所以大部分情況下,使用序列化很簡單。例如:
保存對象:
//創建一個流對象,比如文件輸出流對象 FileOutputStream underlyingStream = new FileOutputStream("C:\\temp\\test"); //用剛才的文件流,創建一個對象序列化輸出流 ObjectOutputStream serializer = new ObjectOutputStream(underlyingStream); //使用該流的輸出函數,將對象序列化后保存到文件流中,也就是保存到了對應文件中。 serializer.writeObject(serializableObject);
讀取對象,操作完全與保存是一一對應:
//創建一個流對象,比如文件輸入流對象 FileInputStream underlyingStream = new FileInputStream("C:\\temp\\test"); //用剛才的文件流,創建一個對象序列化輸入流 ObjectInputStream deserializer = new ObjectInputStream(underlyingStream); //使用該流的輸入函數,將文件中保存的對象讀取到內存中,并創建相應對象。 Object deserializedObject = deserializer.readObject( );
5、什么樣的類可以序列化
不是所有的類都有序列化的必要,比如Thread類等,這些類中并沒有必要保存的信息。這也是序列化沒有成為Java內部功能的原因之一。所以,如果某個類需要序列化功能,類的定義中必須實現Serializable或者Externalizable接口。比如Java API中的Character類:
public final class Character implements java.io.Serializable, Comparable<Character>
6、進一步的內容
進一步的內容比如transient關鍵字、自定義序列化機制、序列化版本控制等,請參考以下文章:
Java RMI ?Chapter 10 ?Serialization ?By William Grossohttp://oreilly.com/catalog/javarmi/chapter/ch10.html
Discover the secrets of the Java Serialization API ? by Todd Greanier
http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html
Ivor Horton's Beginning Java(Java 7 Edition By Ivor Horton) ?Chapter 12 ?Serializing Object
http://cn.bing.com/search?q=beginning+java+java+7+edition&go=&qs=AS&form=QBRE&pq=beginning+java+java&sc=2-19&sp=1&sk=
轉載于:https://my.oschina.net/u/1382972/blog/170148
總結
以上是生活随笔為你收集整理的Java序列化(Serialization)的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Backtrack5 SQL注入漏洞探
- 下一篇: 哦,上下文变量