我有两个课程,A
和B
。
类A
由X公司开发,不可序列化。
Y公司正在尝试使用课程A
中的课程B
,该课程必须是可序列化的。
如何在不更改班级A
的情况下完成此操作?这就是外化界面的用途吗?
答案 0 :(得分:5)
不确定。您需要在班级B
中提及他们的班级A
transient
(如果我已正确拼写,则使用serialPersistentFields
)。在writeObject
中实施自定义readObject
和B
方法,以便在可序列化对象中保存所需的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
的自定义序列化表示中即可。