Java 序列化包含不可序列化类的类

Java 序列化包含不可序列化类的类,java,serialization,Java,Serialization,我有两门课,A和B 类A由X公司开发,不可序列化 公司Y试图在类B中使用类A,该类必须可序列化 如何在不更改classA的情况下完成此操作?这就是外部化接口的用途吗?是的,这可以通过实现java.io.Externalizable-它允许您通过写入单个字节(或者更方便地通过writeInt()等方法)手动实现序列化。只要您可以从类A的公共API中获取并设置有关该类实例的所有信息,就可以将其嵌入到类B的自定义序列化表示中。您需要在类B中创建字段,以引用其类Atransient(或者使用serial

我有两门课,
A
B

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

公司Y试图在类
B
中使用类
A
,该类必须可序列化


如何在不更改class
A
的情况下完成此操作?这就是外部化接口的用途吗?

是的,这可以通过实现
java.io.Externalizable
-它允许您通过写入单个字节(或者更方便地通过
writeInt()
等方法)手动实现序列化。只要您可以从类
A
的公共API中获取并设置有关该类实例的所有信息,就可以将其嵌入到类
B
的自定义序列化表示中。您需要在类
B
中创建字段,以引用其类
A
transient
(或者使用
serialPersistentFields
,如果我拼写正确的话)。在
B
中实现自定义
writeObject
readObject
方法,以在可序列化对象中保存
A
的所需状态


没有必要使用可外部化的
)。

正如@Tom Hawtin-tackline所指出的,您有两种方法来应对这种情况:
1。将类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

}

我已经澄清了你的问题,所以它更清晰了一点,但你真的需要表明你已经做出了真诚的努力来解决你的问题-我们不是来为你做工作的,我们是来帮助你遇到特定问题的。你不需要使用
外部化
。自定义的
readObject
writeObject
方法就足够了。@Bruno Reis感谢您纠正了拼写错误,但这是一个严重的错误:)这不是
serialPersistentFields
的一个有用的拼写错误。这些东西确实应该有一个
@Serial
或类似的注释您可能想要序列化和反序列化
a
@TomHawtin-tackline中包含的状态:是的,我同意您的观点
@Serial
将是一个更好的解决方法,因为这将强制执行编译时检查,并且在拼写正确之前不会让程序编译,不像
serialPersistentField
(oops忘记在最后添加
s
);)。
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

}