我有两个班,A
和B
。
类A
由 X 公司开发,不可序列化。
Y 公司正在尝试使用 class A
in class B
,它必须是可序列化的。
在不改变课程的情况下如何做到这一点A
?这就是外部化接口的用途吗?
我有两个班,A
和B
。
类A
由 X 公司开发,不可序列化。
Y 公司正在尝试使用 class A
in class B
,它必须是可序列化的。
在不改变课程的情况下如何做到这一点A
?这就是外部化接口的用途吗?
当然。您需要在您的班级中创建B
引用他们班级的字段A
transient
(或者serialPersistentFields
如果我拼写正确,则使用)。实现自定义writeObject
和readObject
方法B
以保存可序列化对象的所需状态A
。
没有必要Externalizable
(几乎从来没有)。
正如@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
}
是的,这可以通过实现来完成java.io.Externalizable
——它允许您手动实现序列化,通过编写单个字节(或者更方便地通过类似的方法writeInt()
)。只要您可以从其公共 API获取和设置有关类实例的所有信息,您就可以简单地将其嵌入到您的自定义序列化类表示中。A
B