簡體   English   中英

哪些類必須實現 Serializable 接口?

[英]Which classes must implement the Serializable interface?

我想通過socket發送一個object,所以我必須實現Serializable。 但是我的 class 是復合 class,就像這個簡單的代碼:

class B{
    private int a;
    public B(int aa){a=aa;}
}

class A {
    private B b;
    public A(B b1){ b=b1;}
}

我想發送 class A 的 object,其中包含 B object 等所有內容。 哪些類應該實現 Serializable? 只是A,還是A和B都有?


補充:向量呢? 認為我在 A 中有一個 B 向量,如下所示:

class A {
    private Vector bvector;
}

兩個都。 只要A具有B類型的非靜態成員並且 1) 變量b未標記為transient或 2) class B不實現可序列化,A 就不能序列化。

如果 class 都不是內部 class ,則可以采用任何一種方式。 在許多情況下更簡單地獨立序列化兩者。 但是序列化 A 通常更快,並且更獨立於版本,而不是 B,在 A 的序列化中包含重新創建 B 所需的信息。

如果一個或兩個都是內部類,那么序列化它們會變得更混亂/更慢,最好將它們的娛樂信息包含在外部 class 中。

當然,當 class 的對象被多個其他對象引用時,您通常別無選擇,只能分別序列化它們。

如果您不使 B 可序列化,您將獲得序列化異常。

可以序列化 A 的實例,即使 B 未聲明為Serializable 對此的要求是

  1. Class B 必須提供一個默認構造函數(和)
  2. Class A 必須提供以下方法的實現:

    private void readObject(ObjectInputStream ois)

    private void writeObject(ObjectOutputStream oos)

如果 class B 被聲明為Serializable Vs 而不是,那么序列化 A 的實例肯定更容易。 如果可以,則可以使默認序列化起作用。

在上述情況下,擁有 B 的Vector沒有任何區別(它只是增加了另一層結構)。

您可以使用包裝 class 序列化向量,前提是它是另一個可序列化 class 或子 class 向量的字段以更改其序列化。 這個 class 可以鎖定 Vector 以進行序列化和序列化 A 和 B 類。 如果使用這種方法,則不需要添加 Serializable 標記接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM