簡體   English   中英

為什么我的班級不可序列化?

[英]Why is my class not serializable?

我有以下課程:

import java.awt.Color;
import java.util.Vector;

public class MyClass {

    private ImageSignature imageSignature;

    private class ImageSignature implements Serializable {
        private static final long serialVersionUID = -6552319171850636836L;
        private Vector<Color> colors = new Vector<Color>();

        public void addColor(Color color) {
            colors.add(color);
        }

        public Vector<Color> getColors() {
            return colors;
        }
    }

    // Will be called after imageSignature was set, obviously
    public String getImageSignature() {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(imageSignature);
        oos.close();
        return String(Base64Coder.encode(baos.toByteArray()));
    }
}

當我嘗試調用getImageSignature() ,我得到一個NotSerializableException - 為什么會這樣? 所有成員都是可序列化的,為什么我會收到該錯誤?

ImageSignature每個實例ImageSignature具有對MyClass的封閉實例的隱式引用,而MyClass不可序列化。

要么使MyClass序列化,要么聲明ImageSignature靜態:

private static class ImageSignature implements Serializable {

Java Serialization Spec查看以下信息:

- 由於多種原因,強烈建議不要對內部類(即非靜態成員類的嵌套類)(包括本地類和匿名類)進行序列化。 因為在非靜態上下文中聲明的內部類包含對封閉類實例的隱式非瞬態引用,所以序列化這樣的內部類實例也將導致其關聯的外部類實例的序列化。 由javac(或其他JavaTM編譯器)生成的用於實現內部類的合成字段是依賴於實現的,並且可能在編譯器之間有所不同; 此類字段中的差異可能會破壞兼容性,並導致沖突的默認serialVersionUID值。 分配給本地和匿名內部類的名稱也依賴於實現,並且編譯器之間可能不同。 由於內部類不能聲明除編譯時常量字段之外的靜態成員,因此它們不能使用serialPersistentFields機制來指定可序列化字段。 最后,因為與外部實例關聯的內部類沒有零參數構造函數(此類內部類的構造函數隱式接受封閉實例作為前置參數),所以它們無法實現Externalizable。 但是,上面列出的所有問題都不適用於靜態成員類

要使類Serializable,你應該實現Serlizable接口,它是一個沒有方法的標記或標記接口,所以你的類的對象應該seralize

private static class ImageSignature implements Serializable {// code }

暫無
暫無

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

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