国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Java教程 - Java 序列化詳解及簡單實現實例

Java 序列化詳解及簡單實現實例

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

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

一、序列化

序列化定義:序列化是將對象狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數據。

目的:

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

二、Java序列化

一個對象能夠序列化的前提是實現Serializable接口。Serializable接口沒有方法,更像是個標記。有了這個標記的Class就能被序列化機制處理。如下:

?
1
2
class myPoint implements Serializable{
}

JAVA反序列化不會調用任何構造器

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

  1. 要在方法writeExternal寫入序列化的參數
  2. 要在方法readExternal讀取反序列化的值
  3. 要有默認的構造方法(readExternal執行完成,再執行默認的構造器)
?
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關鍵字 關閉序列化自動進行。
  2. 不管你選擇了哪種序列化形式,都要為自己編寫的每個可序列化的類聲明一個顯示的序列版本UID(serial version UID)

三、序列化的問題

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

1.謹慎地設計實現Serializable接口

  1. 實現發布了就是一種承諾
  2. 如果一個類是為繼承設計的,在‘允許子類實現Serializable接口'與‘禁止子類實現Serializable接口'取一個折中的方案是:提供一個可訪問的無參構造器

2.保護性地編寫 readObject()方法,因為readObject()是構建實例的入口。

不保護可能出現 構建了不滿足要求的 實例

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

  1. 邏輯內容 與 物理表示法
  2. 如果一個對象的 ‘物理表示法'等同于它的‘邏輯內容',可能就適用于使用默認的序列化形式。
  3. 如果有更好的 ‘物理表示法'在表示‘邏輯內容'則可以自定義序列化形式。
?
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());
    }
  }
}

四、序列化代理模式

    序列化機制提供的鉤子函數有:

       writeReplace writeObject  readObject  readResolve

  1. writeReplace:序列化的時候替換所要序列化的對象。
  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. 將對象實例相關的類元數據輸出。
  2. 遞歸地輸出類的超類描述直到不再有超類。
  3. 類元數據完了以后,開始從最頂層的超類開始輸出對象實例的實際數據值。
  4. 從上至下遞歸輸出實例的數據

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.欧美| 97人人草| 欧美日韩国产成人 | 一区二区三区亚洲 | 亚州男人天堂 | av大片 | 国产视频一区二 | 日韩一级视频 | 黄色一级大片在线免费看产 | 波多野结衣三区 | 日韩电影一区二区三区 | a国产精品| 97精品国产| 在线第一页 | 日韩精品成人 | 中文av字幕 | 国产在线小视频 | 午夜视频在线 | 伊人春色网 | 黄色小视频在线观看 | 免费av片在线 | 中文在线视频 | 日本欧美一区二区 | 国偷自产av一区二区三区 | 久久国产综合 | 日韩精品在线免费视频 | 日韩一二三区视频 | 国产精品久久久久久久久久免费 | 国产精品美女久久久免费 | 国产欧美日本 | a国产精品| 日本不卡免费新一二三区 | 日韩成人在线免费观看 | 国产成人精品一区二区三区四区 | 日韩精品一区二区三区四区 | 国产在线色| 欧美日日| 亚洲综合一区二区 | 五月婷婷丁香 | 观看av | 黄色三及毛片 |