欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java序列化(Serialization) 機(jī)制

 更新時(shí)間:2016年07月07日 11:28:56   投稿:lqh  
本篇文章是對(duì)Java中對(duì)象的序列化(Serialization) 機(jī)制進(jìn)行了詳細(xì)的分析介紹,并附實(shí)例,需要的朋友可以參考下

  Java中,一切都是對(duì)象,在分布式環(huán)境中經(jīng)常需要將Object從這一端網(wǎng)絡(luò)或設(shè)備傳遞到另一端。這就需要有一種可以在兩端傳輸數(shù)據(jù)的協(xié)議。Java序列化機(jī)制就是為了解決這個(gè)問(wèn)題而產(chǎn)生。

將對(duì)象狀態(tài)轉(zhuǎn)換成字節(jié)流之后,可以用java.io包中各種字節(jié)流的類將其保存到文件中,管道到另一線程中或通過(guò)網(wǎng)絡(luò)連接將對(duì)象數(shù)據(jù)發(fā)送到另一主機(jī)。對(duì)象序列化功能非常簡(jiǎn)單、強(qiáng)大,在RMI、Socket、JMS、EJB都有應(yīng)用。對(duì)象序列化問(wèn)題在網(wǎng)絡(luò)編程中并不是最核心的課題,但卻相當(dāng)重要,具有許多實(shí)用意義。

java對(duì)象序列化不僅保留一個(gè)對(duì)象的數(shù)據(jù),而且遞歸保存對(duì)象引用的每個(gè)對(duì)象的數(shù)據(jù)??梢詫⒄麄€(gè)對(duì)象層次寫入字節(jié)流中,可以保存在文件中或在網(wǎng)絡(luò)連接上傳遞。利用對(duì)象序列化可以進(jìn)行對(duì)象的“深復(fù)制”,即復(fù)制對(duì)象本身及引用的對(duì)象本身。序列化一個(gè)對(duì)象可能得到整個(gè)對(duì)象的序列。

基本使用方法:  

      Serialization是指把類或者基本的數(shù)據(jù)類型持久化(persistence)到數(shù)據(jù)流(Stream)中,包括文件、字節(jié)流、網(wǎng)絡(luò)數(shù)據(jù)流。

JAVA中實(shí)現(xiàn)serialization主要靠?jī)蓚€(gè)類:ObjectOuputStream和ObjectInputStream。他們是JAVA IO系統(tǒng)里的OutputStream和InputStream的子類。既然他們是JAVA IO中的流,那么就可以像操作一般的流一樣來(lái)操作他們。下面是他們使用方法:

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
 
public class Pair implements Serializable{ 
 
 private static final long serialVersionUID = -1874850715617681161L; 
 private int type; 
 private String name; 
 
 public int getType() { 
 return type; 
 } 
 
 public void setType(int type) { 
 this.type = type; 
 } 
 
 public String getName() { 
 return name; 
 } 
 
 public void setName(String name) { 
 this.name = name; 
 } 
 
 
 public Pair(int type, String name) { 
 super(); 
 this.type = type; 
 this.name = name; 
 } 
 
 public static void main(String[] args) throws IOException, ClassNotFoundException { 
 // TODO Auto-generated method stub 
 //serialize object pair 
 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
 ObjectOutputStream oos = new ObjectOutputStream(bos); 
 Pair pair = new Pair(1, "charlie"); 
 oos.writeObject(pair); 
 //deserialize object, get new object newpair 
 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
 ObjectInputStream ois = new ObjectInputStream(bis); 
 Pair newpair = (Pair) ois.readObject(); 
 
 System.out.println(newpair.getType()+":"+newpair.getName()); 
 } 
} 

1. 這兩個(gè)類都是decorator模式的,在創(chuàng)建他們的時(shí)候,都要傳入一個(gè)基于字節(jié)的流,真正在底下存貯序列化數(shù)據(jù)的都是這些流。

 2. 被持久化的類要實(shí)現(xiàn)Serializable接口,這個(gè)接口沒(méi)有任何函數(shù),只是一個(gè)標(biāo)記接口。如果在一臺(tái)機(jī)器上進(jìn)行序列化,把得到的數(shù)據(jù)傳送到另外一個(gè)機(jī)器上進(jìn)行反序列化,那么這兩臺(tái)機(jī)器上的類應(yīng)該是完全一樣的,否則序列化是不會(huì)成功的。

 3. 切記不要把上面代碼中的bos用toString得到String,然后再?gòu)倪@個(gè)String中得到ByteArrayInputStream,再進(jìn)行反序列化。bos是以字節(jié)存貯的,轉(zhuǎn)成以字符存貯的String必然會(huì)造成數(shù)據(jù)的變化,而從String中到的byte[]也不會(huì)是之前那個(gè)byte[]了。我遇到過(guò)這個(gè)問(wèn)題,是因?yàn)槲蚁氚研蛄谢蟮臄?shù)據(jù)存在xml文件中。這個(gè)問(wèn)題的具體解決方法見(jiàn)我的另外一篇文章:

www.dbjr.com.cn/article/88130.htm

java虛擬機(jī)在序列化和反序列化的時(shí)候都做了些什么?

javadoc中對(duì)這兩個(gè)類的描述中對(duì)java的序列化機(jī)制進(jìn)行了詳細(xì)的描述:

引用

The default serialization mechanism for an object writes the class of the object, the class signature, and the values of all non-transient and non-static fields. References to other objects (except in transient or static fields) cause those objects to be written also. Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written.

默認(rèn)的序列化機(jī)制寫到流中的數(shù)據(jù)有:

1、對(duì)象所屬的類
2、類的簽名
3、所有的非transient和非static的屬性
4、對(duì)其他對(duì)象的引用也會(huì)造成對(duì)這些對(duì)象的序列化
5、如果多個(gè)引用指向一個(gè)對(duì)象,那么會(huì)使用sharing reference機(jī)制

引用

Classes that require special handling during the serialization and deserialization process must implement special methods with these exact signatures:

private void readObject(java.io.ObjectInputStream stream) 
 throws IOException, ClassNotFoundException; 
private void writeObject(java.io.ObjectOutputStream stream) 
 throws IOException 
private void readObjectNoData() 
 throws ObjectStreamException; 

相關(guān)文章

  • java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式

    java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式

    這篇文章主要為大家詳細(xì)介紹了java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Java 類加載過(guò)程與類加載器詳細(xì)介紹

    Java 類加載過(guò)程與類加載器詳細(xì)介紹

    這篇文章主要介紹了Java 類加載過(guò)程與類加載器詳細(xì)介紹,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • SpringCloud?Eureka服務(wù)注冊(cè)中心應(yīng)用入門詳解

    SpringCloud?Eureka服務(wù)注冊(cè)中心應(yīng)用入門詳解

    這篇文章主要介紹了Spring?Cloud?Eureka服務(wù)注冊(cè)中心入門流程分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Java中Lombok的@Builder注解注意事項(xiàng)

    Java中Lombok的@Builder注解注意事項(xiàng)

    這篇文章主要介紹了Java中Lombok的@Builder注解注意事項(xiàng),使用Lombok也會(huì)造成很多問(wèn)題,尤其@Builder 有個(gè)很大的坑,已經(jīng)見(jiàn)過(guò)好幾次由于使用@Builder注解導(dǎo)致默認(rèn)值失效的問(wèn)題,如果測(cè)試時(shí)沒(méi)有在意這個(gè)問(wèn)題,就很容易引發(fā)線上問(wèn)題,需要的朋友可以參考下
    2023-12-12
  • Spring集成MongoDB的兩種方法實(shí)例

    Spring集成MongoDB的兩種方法實(shí)例

    最近使用到了Spring框架,考慮到數(shù)據(jù)的格式并非有固定的字段格式,因此考慮到使用MongoDB非關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),所以這篇文章主要給大家介紹了Spring集成MongoDB的兩種方法,需要的朋友可以參考下
    2021-09-09
  • Spring高級(jí)接口Aware淺析

    Spring高級(jí)接口Aware淺析

    通過(guò)aware接口可以獲取Spring容器相關(guān)信息,但這樣會(huì)與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下
    2023-01-01
  • Java實(shí)現(xiàn)的樸素貝葉斯算法示例

    Java實(shí)現(xiàn)的樸素貝葉斯算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的樸素貝葉斯算法,結(jié)合實(shí)例形式分析了基于java的樸素貝葉斯算法定義及樣本數(shù)據(jù)訓(xùn)練操作相關(guān)使用技巧,需要的朋友可以參考下
    2018-06-06
  • 淺析Java SPI 與 dubbo SPI

    淺析Java SPI 與 dubbo SPI

    在Java中SPI是被用來(lái)設(shè)計(jì)給服務(wù)提供商做插件使用的。本文重點(diǎn)給大家介紹Java SPI 與 dubbo SPI的相關(guān)知識(shí)及區(qū)別介紹,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2021-05-05
  • Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解

    Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解

    這篇文章主要介紹了Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • HelloSpringMVC注解版實(shí)現(xiàn)步驟解析

    HelloSpringMVC注解版實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了HelloSpringMVC注解版實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論