一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java 序列化詳解及簡單實(shí)現(xiàn)實(shí)例

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

2020-08-25 10:39Java之家 Java教程

這篇文章主要介紹了 Java 序列化詳解及簡單實(shí)現(xiàn)實(shí)例的相關(guān)資料,使用序列化目的:以某種存儲(chǔ)形式使自定義對象持久化,將對象從一個(gè)地方傳遞到另一個(gè)地方,需要的朋友可以參考下

一、序列化

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

目的:

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

二、Java序列化

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

?
1
2
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)造器)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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è)可訪問的無參構(gòu)造器

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

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

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

  1. 邏輯內(nèi)容 與 物理表示法
  2. 如果一個(gè)對象的 ‘物理表示法'等同于它的‘邏輯內(nèi)容',可能就適用于使用默認(rèn)的序列化形式。
  3. 如果有更好的 ‘物理表示法'在表示‘邏輯內(nèi)容'則可以自定義序列化形式。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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í)候替換所要序列化的對象。
  2. writeObject:寫入序列化的對象
  3. readObject:讀取序列化的對象
  4. readResolve:最后返回序列化對象
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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. 將對象實(shí)例相關(guān)的類元數(shù)據(jù)輸出。
  2. 遞歸地輸出類的超類描述直到不再有超類。
  3. 類元數(shù)據(jù)完了以后,開始從最頂層的超類開始輸出對象實(shí)例的實(shí)際數(shù)據(jù)值。
  4. 從上至下遞歸輸出實(shí)例的數(shù)據(jù)

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

原文鏈接:http://blog.csdn.net/qq_35101189/article/details/60570096

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品久久久久AV无码 | 亚洲精品国产乱码AV在线观看 | 四虎影音先锋 | 青草影院在线观看 | 毛片99| 女人用粗大自熨喷水在线视频 | 亚洲国产欧美另类va在线观看 | 国产chinese男同gay| 国产精品久久国产三级国电话系列 | 国产一区二区精品久 | 国产精品调教 | 窝窝午夜精品一区二区 | 欧美18-19sex性处 | 性德国高清xxxxbbbb | 五月天色综合 | 奇米影视在线视频8888 | 亚洲精品一二三四 | 波多野结衣一区免费作品 | 我和么公的秘密小说免费 | 精品国产自在在线在线观看 | 欧美一级xxx| 秋霞理论最新三级理论最 | 亚洲丰满模特裸做爰 | 美女脱了内裤打开腿让男人图片 | piss美女厕所小便 | 天美传媒果冻传媒星空传媒 | katsuniav在线播放 | 日本伊人色综合网 | 小鸟酱喷水 | 99视频有精品视频免费观看 | 91日本在线 | 催眠白丝舞蹈老师小说 | 成人午夜爽爽爽免费视频 | 欧美一级视频在线 | japonensis日本护士18 | 成人女人天堂午夜视频 | 日本xxx18hd| 午夜国产精品 | 暖暖的视频完整视频韩国免费 | 成熟女人50岁一级毛片不卡 | 91热这里只有精品 |