序列化包含非可序列化类的类

时间:2013-06-28 18:30:52

标签: java serialization

我有两个课程,AB

A由X公司开发,不可序列化。

Y公司正在尝试使用课程A中的课程B,该课程必须是可序列化的。

如何在不更改班级A的情况下完成此操作?这就是外化界面的用途吗?

3 个答案:

答案 0 :(得分:5)

不确定。您需要在班级B中提及他们的班级A transient(如果我已正确拼写,则使用serialPersistentFields)。在writeObject中实施自定义readObjectB方法,以便在可序列化对象中保存所需的A状态。

不需要Externalizable(几乎没有)。

答案 1 :(得分:3)

正如@Tom Hawtin指出 - 强调你有两种方法来对抗这种情况:
1。 将A类的实例变量声明为瞬态..

private transient A a ;

或者,
2。使用serialPersistentFields。这指示JVM仅保留它提到的那些字段。这是一个简短的例子:

public class B implements Serializable
{
    private A a;
    private String name ;
    private int enrollment;
    private static final ObjectStreamField[] serialPersistentFields = 
        {
            new ObjectStreamField("name",String.class),
            new ObjectStreamField("enrollment",int.class)
        }; //This will cause only "name" and "enrollment" to persist while serialization

}

答案 2 :(得分:0)

是的,这可以通过实现java.io.Externalizable来完成 - 它允许您通过编写单个字节(或更方便地通过writeInt()等方法)手动实现序列化。只要您可以从其公共API获取并设置有关类A的实例的所有信息,您只需将其嵌入到类B的自定义序列化表示中即可。