2

我有两个班,AB

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

Y 公司正在尝试使用 class Ain class B,它必须是可序列化的。

在不改变课程的情况下如何做到这一点A?这就是外部化接口的用途吗?

4

3 回答 3

5

当然。您需要在您的班级中创建B引用他们班级的字段A transient(或者serialPersistentFields如果我拼写正确,则使用)。实现自定义writeObjectreadObject方法B以保存可序列化对象的所需状态A

没有必要Externalizable(几乎从来没有)。

于 2013-06-28T18:47:03.057 回答
3

正如@Tom Hawtin 指出的那样- tackline 您有两种方法可以应对这种情况:
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

}
于 2013-06-28T19:40:01.480 回答
0

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

于 2013-06-28T18:45:17.983 回答