繁体   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