最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 序列化詳解及簡(jiǎn)單實(shí)現(xiàn)實(shí)例

 更新時(shí)間:2017年03月06日 15:17:34   投稿:lqh  
這篇文章主要介紹了 Java 序列化詳解及簡(jiǎn)單實(shí)現(xiàn)實(shí)例的相關(guān)資料,使用序列化目的:以某種存儲(chǔ)形式使自定義對(duì)象持久化,將對(duì)象從一個(gè)地方傳遞到另一個(gè)地方,需要的朋友可以參考下

一、序列化

序列化定義:序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程。與序列化相對(duì)的是反序列化,它將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過程結(jié)合起來(lái),可以輕松地存儲(chǔ)和傳輸數(shù)據(jù)。

目的:

  1. 以某種存儲(chǔ)形式使自定義對(duì)象持久化
  2. 將對(duì)象從一個(gè)地方傳遞到另一個(gè)地方

二、Java序列化

一個(gè)對(duì)象能夠序列化的前提是實(shí)現(xiàn)Serializable接口。Serializable接口沒有方法,更像是個(gè)標(biāo)記。有了這個(gè)標(biāo)記的Class就能被序列化機(jī)制處理。如下:

class myPoint implements Serializable{ 
} 
 

JAVA反序列化不會(huì)調(diào)用任何構(gòu)造器

序列化的控制:Externalizable。讀寫都交給你

  1. 要在方法writeExternal寫入序列化的參數(shù)
  2. 要在方法readExternal讀取反序列化的值
  3. 要有默認(rèn)的構(gòu)造方法(readExternal執(zhí)行完成,再執(zhí)行默認(rèn)的構(gòu)造器)
void writeExternal(ObjectOutput out) throws IOException; 
void readExternal(ObjectInput in) throws IOException,ClassNotFoundException; 
public class Point implements Externalizable { 
  private int a; 
  private int b; 
  public Point(int a, int b) { 
    this.a = a; 
    this.b = b; 
  } 
  public Point() { 
  } 
  public String toString() { 
    return a + " , " + b; 
  } 
   
  public void writeExternal(ObjectOutput out) throws IOException { 
    out.write(a); 
    out.write(b); 
  } 
  public void readExternal(ObjectInput in) throws IOException, 
      ClassNotFoundException { 
    a = in.read(); 
    b = in.read(); 
  } 
  public static void main(String[] args) throws IOException, 
      ClassNotFoundException { 
    String file = "d://1.txt"; 
    Point p = new Point(1, 2); 
    System.out.println(p); 
    FileOutputStream fos = new FileOutputStream(file); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(p); 
    FileInputStream fis = new FileInputStream(file); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    Point pp = (Point) ois.readObject(); 
    System.out.println(pp); 
  } 
} 
 
  1. transient關(guān)鍵字 關(guān)閉序列化自動(dòng)進(jìn)行。
  2. 不管你選擇了哪種序列化形式,都要為自己編寫的每個(gè)可序列化的類聲明一個(gè)顯示的序列版本UID(serial version UID)

三、序列化的問題

在effective Java中列舉出了java序列化要注意的一些問題:

1.謹(jǐn)慎地設(shè)計(jì)實(shí)現(xiàn)Serializable接口

  1. 實(shí)現(xiàn)發(fā)布了就是一種承諾
  2. 如果一個(gè)類是為繼承設(shè)計(jì)的,在‘允許子類實(shí)現(xiàn)Serializable接口'與‘禁止子類實(shí)現(xiàn)Serializable接口'取一個(gè)折中的方案是:提供一個(gè)可訪問的無(wú)參構(gòu)造器

2.保護(hù)性地編寫 readObject()方法,因?yàn)閞eadObject()是構(gòu)建實(shí)例的入口。

不保護(hù)可能出現(xiàn) 構(gòu)建了不滿足要求的 實(shí)例

3.考慮自定義的序列化形式

  1. 邏輯內(nèi)容 與 物理表示法
  2. 如果一個(gè)對(duì)象的 ‘物理表示法'等同于它的‘邏輯內(nèi)容',可能就適用于使用默認(rèn)的序列化形式。
  3. 如果有更好的 ‘物理表示法'在表示‘邏輯內(nèi)容'則可以自定義序列化形式。
public class StringList implements Serializable { 
  private transient int size = 0; 
  private transient Entity head = null; 
  public final void add(String str) { 
    // ... 
  } 
  private static class Entity { 
    String data; 
    Entity next; 
    Entity previous; 
  } 
  private void writeObject(ObjectOutputStream s) throws IOException { 
    s.defaultWriteObject(); 
    s.write(size); 
    for (Entity e = head; e != null; e = e.next) { 
      s.writeObject(e.data); 
    } 
  } 
  private void readObject(ObjectInputStream s) throws IOException, 
      ClassNotFoundException { 
    s.defaultReadObject(); 
    int num = s.read(); 
    for (int i = 0; i < num; i++) { 
      this.add((String) s.readObject()); 
    } 
  } 
} 
 

四、序列化代理模式

    序列化機(jī)制提供的鉤子函數(shù)有:

       writeReplace writeObject  readObject  readResolve

  1. writeReplace:序列化的時(shí)候替換所要序列化的對(duì)象。
  2. writeObject:寫入序列化的對(duì)象
  3. readObject:讀取序列化的對(duì)象
  4. readResolve:最后返回序列化對(duì)象
import java.io.InvalidObjectException; 
import java.io.ObjectInputStream; 
import java.io.Serializable; 
import java.util.Date; 
public final class Period implements Serializable { 
  private static final long serialVersionUID = 100L; 
  private final Date start; 
  private final Date end; 
  public Period(Date start, Date end) { 
    this.start = new Date(start.getTime()); 
    this.end = new Date(end.getTime()); 
    if (this.start.compareTo(this.end) > 0) { 
      throw new IllegalArgumentException(start + " after " + end); 
    } 
  } 
  public Date start() { 
    return new Date(start.getTime()); 
  } 
  public Date end() { 
    return new Date(end.getTime()); 
  } 
  public String toString() { 
    return start + " - " + end; 
  } 
  // 不給 
  private Object writeReplace() { 
    return new SerializationProxy(this); 
  } 
  private void readObject(ObjectInputStream stream) 
      throws InvalidObjectException { 
    throw new InvalidObjectException("proxy request"); 
  } 
  private static class SerializationProxy implements Serializable { 
    private final Date start; 
    private final Date end; 
    SerializationProxy(Period p) { 
      this.start = p.start; 
      this.end = p.end; 
    } 
    private Object readResolve() { 
      return new Period(start, end); 
    } 
    private static final long serialVersionUID = 1000L; 
  } 
}  

五、序列化算法

  1. 將對(duì)象實(shí)例相關(guān)的類元數(shù)據(jù)輸出。
  2. 遞歸地輸出類的超類描述直到不再有超類。
  3. 類元數(shù)據(jù)完了以后,開始從最頂層的超類開始輸出對(duì)象實(shí)例的實(shí)際數(shù)據(jù)值。
  4. 從上至下遞歸輸出實(shí)例的數(shù)據(jù)

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Spring中讀取配置文件的五種方式

    Spring中讀取配置文件的五種方式

    在使用spring或springboot項(xiàng)目開發(fā)中,難免會(huì)涉及到讀取配置文件的各種配置參數(shù)的情況,因?yàn)楫?dāng)項(xiàng)目的規(guī)模上去之后,在單個(gè)配置文件中維護(hù)所有的配置信息很難滿足實(shí)際的需要,所以本文給大家介紹了Spring讀取配置文件多種方式,需要的朋友可以參考下
    2024-04-04
  • springboot微服務(wù)項(xiàng)目集成html頁(yè)面的實(shí)現(xiàn)

    springboot微服務(wù)項(xiàng)目集成html頁(yè)面的實(shí)現(xiàn)

    本文主要介紹了springboot微服務(wù)項(xiàng)目集成html頁(yè)面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 詳解java的四舍五入與保留位示例

    詳解java的四舍五入與保留位示例

    本篇文章主要介紹了java的四舍五入與保留位示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-08-08
  • Java多線程實(shí)戰(zhàn)之交叉打印的兩種方法

    Java多線程實(shí)戰(zhàn)之交叉打印的兩種方法

    今天小編就為大家分享一篇關(guān)于Java多線程實(shí)戰(zhàn)之交叉打印的兩種方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 支付寶APP支付(IOS手機(jī)端+java后臺(tái))版

    支付寶APP支付(IOS手機(jī)端+java后臺(tái))版

    這篇文章主要為大家詳細(xì)介紹了支付寶APP支付(IOS手機(jī)端+java后臺(tái))版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • SpringBoot和Vue2項(xiàng)目配置https協(xié)議過程

    SpringBoot和Vue2項(xiàng)目配置https協(xié)議過程

    本文詳細(xì)介紹了SpringBoot項(xiàng)目和Vue2項(xiàng)目的部署流程及SSL證書配置,對(duì)于SpringBoot項(xiàng)目,需將.pfx文件放入resources目錄并配置server,然后打包部署,Vue2項(xiàng)目中,涉及檢查nginx的SSL模塊、編譯新的nginx文件
    2024-10-10
  • JVM指令的使用深入詳解

    JVM指令的使用深入詳解

    這篇文章主要給大家介紹了關(guān)于JVM指令使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • SpringBoot中的Redis?緩存問題及操作方法

    SpringBoot中的Redis?緩存問題及操作方法

    這篇文章主要介紹了SpringBoot中的Redis?緩存,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • SpringBoot應(yīng)用整合ELK實(shí)現(xiàn)日志收集的示例代碼

    SpringBoot應(yīng)用整合ELK實(shí)現(xiàn)日志收集的示例代碼

    這篇文章主要介紹了SpringBoot應(yīng)用整合ELK實(shí)現(xiàn)日志收集的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java中對(duì)象的序列化方式克隆詳解

    Java中對(duì)象的序列化方式克隆詳解

    在學(xué)習(xí)編程的過程中,我覺得不止要獲得課本的知識(shí),更多的是通過學(xué)習(xí)技術(shù)知識(shí)提高解決問題的能力,這樣我們才能走在最前方。這篇文章主要給大家介紹了Java中對(duì)象的序列化方式克隆,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01

最新評(píng)論

郎溪县| 铜川市| 静海县| 久治县| 长治市| 巴楚县| 富裕县| 屏东县| 车险| 壶关县| 岳阳市| 武平县| 木兰县| 丰台区| 临汾市| 安丘市| 祁阳县| 大同市| 社旗县| 永宁县| 高碑店市| 信丰县| 璧山县| 巴青县| 贵定县| 都匀市| 商丘市| 乾安县| 抚远县| 青海省| 正宁县| 临城县| 交城县| 尖扎县| 中西区| 万宁市| 丰城市| 建湖县| 晋宁县| 扬州市| 牡丹江市|