日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java序列化(Serialization)的理解

發(fā)布時(shí)間:2025/5/22 148 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java序列化(Serialization)的理解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

1、什么是序列化

  Java是面向?qū)ο蟮木幊陶Z言,有時(shí)需要保存對(duì)象,并在下次使用時(shí)可以順利還原該對(duì)象。由于這種需求很常見,所以Java API對(duì)此提供了支持,添加相關(guān)程序代碼到標(biāo)準(zhǔn)類庫中,并將保存和還原的過程稱之為“對(duì)象序列化”。
  Java SE7 文檔中將與對(duì)象序列化的相關(guān)內(nèi)容做了詳細(xì)表述,將其稱為:
  “Java對(duì)象序列化規(guī)范” ?Java Object Serialization Specification,網(wǎng)址為:
  http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html


2、為什么叫序列化

  個(gè)人猜測(cè):
  由于保存對(duì)象的過程,是把對(duì)象保存為一連串字節(jié)流,而英文Serialization的意思“序列化”,所以序列化形象的表述了這個(gè)過程。


3、序列化保存那些內(nèi)容

  對(duì)象(object)是類(class)的一個(gè)實(shí)例(instance)。一個(gè)類中包含了變量(field)和函數(shù)(method)兩個(gè)部分。同一個(gè)類的不同對(duì)象只是變量不同,所以Java API序列化過程中只保存了對(duì)象的變量部分。同樣,由于靜態(tài)變量(static field)是由同一個(gè)類的各個(gè)對(duì)象共用的,所以序列化過程中也不保存。
  由于還原對(duì)象時(shí)需要在程序中動(dòng)態(tài)創(chuàng)建該對(duì)象,所以程序也需要知道該對(duì)象的類定義,所以如果對(duì)象由一個(gè)程序序列化保存之后,由另外一個(gè)程序反序列化還原時(shí),類文件也需要傳送給該程序。這就需要擴(kuò)展Java API序列化的功能,對(duì)其進(jìn)行自定義。Java的遠(yuǎn)程方法調(diào)用(Remote Method Invocation, RMI)功能,就是以Java API序列化為基礎(chǔ),并進(jìn)行了擴(kuò)展。




3、序列化的用途

 序列化主要有三個(gè)用途:
  • 對(duì)象持久化(persistence)
  對(duì)象持久化是指延長對(duì)象的存在時(shí)間。通常狀況下,當(dāng)程序結(jié)束時(shí),程序中的對(duì)象不再存在。
  如果通過序列化功能,將對(duì)象保存到文件中,就可以延長對(duì)象的存在時(shí)間,在下次程序運(yùn)行是再恢復(fù)該對(duì)象。
  序列化將對(duì)象保存在文件中,是實(shí)現(xiàn)對(duì)象持久化的一種方式。持久化還有很多種方式,比如Hibernate框架就提供了一整套對(duì)象持久化的方案。
  • 對(duì)象復(fù)制
  通過序列化,將對(duì)象保存在內(nèi)存中,可以再通過此數(shù)據(jù)得到多個(gè)對(duì)象的副本。
  • 對(duì)象傳輸
  通過序列化,將對(duì)象轉(zhuǎn)化字節(jié)流后,可以通過網(wǎng)絡(luò)發(fā)送給另外的Java程序。


4、什么是流(Stream)

  Java是面向?qū)ο蟮木幊陶Z言,對(duì)象是對(duì)現(xiàn)實(shí)實(shí)體的抽象表述。所以Java API中流(Stream)是對(duì)一連串?dāng)?shù)據(jù)的抽象,同時(shí)定義了一些操作,write和read等。所以現(xiàn)實(shí)實(shí)體,只要包含數(shù)據(jù)和對(duì)數(shù)據(jù)的讀寫操作都可以表示為流。OutputStream類和InputStream類,是2個(gè)抽象類,分別對(duì)應(yīng)輸出、輸入流,所有其它流對(duì)象,都是其子類。
  比如文件,文件本質(zhì)是保存在存儲(chǔ)設(shè)備中的一連串?dāng)?shù)據(jù),在Java API中抽象為FileOutputStream類和FileInputStream類,文件的讀寫可以通過對(duì)相應(yīng)流的讀寫實(shí)現(xiàn)的。
  比如控制臺(tái)中命令和結(jié)果的輸入輸出,鍵盤的輸入是一串?dāng)?shù)據(jù),程序的輸出是一串?dāng)?shù)據(jù),所以在Java API中也被抽象為流對(duì)象。控制臺(tái)輸入由System.in對(duì)象體現(xiàn),System.in是類型為InputStream的對(duì)象。控制臺(tái)輸出由System.out對(duì)象體現(xiàn),System.out是類型為PrintStream的對(duì)象。
  由于文件和控制臺(tái)輸入輸出都和操作系統(tǒng)有關(guān),所以文件流和控制臺(tái)流對(duì)象最終都是由Java虛擬機(jī)創(chuàng)建的。
  ByteArrayOutputStream、ByteArrayInputStream,是完全不依賴Java虛擬機(jī)的流對(duì)象,其完全是對(duì)一個(gè)byte[]數(shù)組的抽象。因?yàn)閎yte[]數(shù)組也是一連串?dāng)?shù)據(jù),byte[]數(shù)組支持讀寫功能,所以完全可以抽象為流對(duì)象,這可以從這兩個(gè)類的源代碼中看出。


4、使用序列化功能

  在Java API中,對(duì)象序列化接口主要由兩個(gè)類提供:ObjectOutputStream,ObjectInputStream。
  為了滿足保存到文件、內(nèi)存、通過網(wǎng)絡(luò)傳輸?shù)炔煌枨?#xff0c;對(duì)象序列化后保存在流對(duì)象中。提供不同的流對(duì)象時(shí),序列化后保存在相應(yīng)流對(duì)象中。比如提供FileOutputStream和FileInputStream,就保存在文件中;提供ByteArrayOutputStream、ByteArrayInputStream,就保存在內(nèi)存中。
  由于Java API已經(jīng)提供了實(shí)現(xiàn)序列化需要的相關(guān)代碼,所以大部分情況下,使用序列化很簡單。例如:
  保存對(duì)象:
//創(chuàng)建一個(gè)流對(duì)象,比如文件輸出流對(duì)象 FileOutputStream underlyingStream = new FileOutputStream("C:\\temp\\test"); //用剛才的文件流,創(chuàng)建一個(gè)對(duì)象序列化輸出流 ObjectOutputStream serializer = new ObjectOutputStream(underlyingStream); //使用該流的輸出函數(shù),將對(duì)象序列化后保存到文件流中,也就是保存到了對(duì)應(yīng)文件中。 serializer.writeObject(serializableObject);

  讀取對(duì)象,操作完全與保存是一一對(duì)應(yīng):
//創(chuàng)建一個(gè)流對(duì)象,比如文件輸入流對(duì)象 FileInputStream underlyingStream = new FileInputStream("C:\\temp\\test"); //用剛才的文件流,創(chuàng)建一個(gè)對(duì)象序列化輸入流 ObjectInputStream deserializer = new ObjectInputStream(underlyingStream); //使用該流的輸入函數(shù),將文件中保存的對(duì)象讀取到內(nèi)存中,并創(chuàng)建相應(yīng)對(duì)象。 Object deserializedObject = deserializer.readObject( );


5、什么樣的類可以序列化

  不是所有的類都有序列化的必要,比如Thread類等,這些類中并沒有必要保存的信息。這也是序列化沒有成為Java內(nèi)部功能的原因之一。所以,如果某個(gè)類需要序列化功能,類的定義中必須實(shí)現(xiàn)Serializable或者Externalizable接口。
  比如Java API中的Character類:
public final class Character implements java.io.Serializable, Comparable<Character>




6、進(jìn)一步的內(nèi)容

  進(jìn)一步的內(nèi)容比如transient關(guān)鍵字、自定義序列化機(jī)制、序列化版本控制等,請(qǐng)參考以下文章:

  Java RMI ?Chapter 10 ?Serialization ?By William Grosso
  http://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=

轉(zhuǎn)載于:https://my.oschina.net/u/1382972/blog/170148

總結(jié)

以上是生活随笔為你收集整理的Java序列化(Serialization)的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。