什麼是Java序列化?爲什麼序列化?序列化有哪些方式?

    先普及一下,計算機中無法識別一個基本單元【字節】來表示,必須經過“翻譯”才能讓計算機理解人類的語言,這個翻譯過程就是【編碼】,通常所說的字符轉換爲字節。  有I/O的地方機就會涉及編碼,現在幾乎所有的應用程序都涉及網絡I/O和磁盤I/O,而數據傳輸時都是以字節爲單位的,所以所有的數據都必須能夠序列化爲字節。  

什麼是Java序列化?

簡單來說 序列化就是把Java對象儲存在某一地方(硬盤、網絡),也就是將對象的內容進行流化。
反序列化:就是把二進制數據反序列化成對象數據
爲什麼要序列化?
方便於傳輸、存儲(內存中的對象狀態保存到一個文件中或者數據庫中;套接字在網絡上傳送對象;RMI)。

JAVA序列化有哪些方式(性能由低至高)
Java Serialization(主要是採用JDK自帶的Java序列化實現,性能很不理想)
Json(目前有兩種實現,一種是採用的阿里的fastjson庫,另一種是採用dubbo中自己實現的簡單json庫)
FastJson(阿里的fastjson庫)
Hession(它基於HTTP協議傳輸,使用Hessian二進制序列化,對於數據包比較大的情況比較友好。)
Dubbo Serialization(阿里dubbo序列化)
FST(高性能、序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右)
Kryo
重點說下 FST的用法——>開源中國:http://www.oschina.net/p/fst
<dependency>  
  <groupId>de.ruedigermoeller</groupId>  
  <artifactId>fst</artifactId>  
  <version>2.04</version>  
</dependency> 
// ! reuse this Object, it caches metadata. Performance degrades massively
// if you create a new Configuration Object with each serialization !
static FSTConfiguration conf = FSTConfiguration.createDefaultConfiguration();
...
public MyClass myreadMethod(InputStream stream) throws IOException, ClassNotFoundException
{
    FSTObjectInput in = conf.getObjectInput(stream);
    MyClass result = in.readObject(MyClass.class);
    // DON'T: in.close(); here prevents reuse and will result in an exception      
    stream.close();
    return result;
}

public void mywriteMethod( OutputStream stream, MyClass toWrite ) throws IOException 
{
    FSTObjectOutput out = conf.getObjectOutput(stream);
    out.writeObject( toWrite, MyClass.class );
    // DON'T out.close() when using factory method;
    out.flush();
    stream.close();
}

java通常在什麼情況下用到序列化?

我們的Java程序必須要運行在Java虛擬機中,那麼在同一個Java虛擬機進程中,換句話說是在同一快內存空間裏面,什麼地方需要用此對象,直接傳遞該對象的引用就可以了,我們想調某一個對象的方法,通過該對象的引用就可以了,傳過去就可以了;
那麼我問你,如果是不同的Java虛擬機進程呢?不同的內存空間呢?甚至我北京的計算機的Java虛擬機中的某一個類,需要使用廣州的某臺計算機上的某個Java對象呢?怎麼辦?
這是不同的內存空間,你怎麼調?
補充:
對象的序列化技術,實現的手段是通過Object流,那麼我上面所說的需求,你就可以通過對象序列化,將此對象序列化之後得到一些“內容”,通過網絡傳輸這部分“內容”,從廣州的服務器上將一個對象序列化之後傳過來,到了我北京的服務器上,再通過反序列化,在北京的服務器內存中“造出一個對象出來”,這個對象和你序列化之前廣州服務器上的對象是一樣的,ok,你可以隨便調方法了;
補充:
對象的序列化技術在EJB3.0中得到廣泛的使用,分佈式的架構,遠程方法調用(RMI),那肯定要用到對象序列化;
客戶端通過JNDI查找到某一個EJB,那麼你調了該企業Bean的方法,傳近去的這個參數是需要序列化的,該方法的返回值,也是要序列化傳過來的;
補充:
對象的序列化就是可以將對象序列化之後便於在網絡上傳輸,或者保存到物理介質上;比方說你做了個遊戲,你玩了一半你想存盤,那麼存盤,就可以簡單理解爲將當前遊戲運行的所有對象序列化保存到硬盤上,然後你再次玩的時候,你讀取存檔,就是反序列化,“再弄出這些對象出來”,繼續運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章