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

服務(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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 69日本xxxxxxxxx98| 免费超级乱淫视频播放性 | 欧美又黄又激烈真实床戏 | 大胸孕妇孕交pregnantsex 大象视频污 | 韩国成人毛片aaa黄 含羞草国产亚洲精品岁国产精品 | 2020最新韩国理论三级0k | 美女翘臀内疯狂进出 | 精品国产一级毛片大全 | 成人性色生活片免费网 | japanesexxxx日本妞 | 北海市副市长黄江老公 | 草逼吧 | 亚洲国产中文字幕在线视频综合 | 99国产情在线视频 | 欧洲美女人牲交一级毛片 | 黑人粗长巨茎小说 | 美女扒开屁股让男人进去 | 亚洲午夜大片 | 天堂网在线.www天堂在线资源 | yellow字幕网在线zmzz91 | 国产欧美一区二区成人影院 | 久久99热狠狠色一区二区 | 成人免费网址 | 国产免费一区二区 | 爸爸干女儿小说 | 91精品国产综合久久福利 | 1769亚洲资源站365在线 | 欧美成人tv | 91东航翘臀女神在线播放 | 亚洲国产欧美在线成人aaaa | 亚洲精品久久久WWW游戏好玩 | 国产午夜亚洲精品一区网站 | 热久久最新 | 青青草原在线 | 国产 日韩 一区 | 亚洲欧美一区二区三区不卡 | 久久se精品一区二区国产 | 3p文两男一女办公室高h | 欧美成人aaaa免费高清 | 美女脱了内裤打开腿让男人图片 | wc凹凸撒尿间谍女厕hd |