java中序列化的基本组件是什么?

java中序列化的基本组件是什么?,java,serialization,Java,Serialization,假设项目A中有以下接口 interface Business extends Serializable{//project A void do_work(); } 这里我们在项目B中有一个类,它实现了接口 class LocalBusiness implements Business{ private static final long serialVersionUID = 0xF109BAC00L; void do_work(){ System.out.print("Hi ther

假设项目A中有以下接口

interface Business extends Serializable{//project A
 void do_work();
}
这里我们在项目B中有一个类,它实现了接口

class LocalBusiness implements Business{
 private static final long serialVersionUID = 0xF109BAC00L;
 void do_work(){
  System.out.print("Hi there\n");
 }
}
然后我将在特定的状态下封送(序列化)一个
LocalBusiness
实例


我的问题是,我想在项目C中解开它,那么项目C是否需要(类路径)业务接口的实际实现?

是的,它应该。运行时类型的类名由默认序列化机制序列化。此类名用于确定反序列化时的运行时类型。如果Java找不到具有接收名称(和serialVersionUID)的类,它将抛出异常。试试看,你会明白的


另一方面:您的界面扩展了可序列化的
。在大多数情况下,这被认为是不好的做法。

是的,应该这样做。运行时类型的类名由默认序列化机制序列化。此类名用于确定反序列化时的运行时类型。如果Java找不到具有接收名称(和serialVersionUID)的类,它将抛出异常。试试看,你会明白的


另一方面:您的界面扩展了可序列化的
。在大多数情况下,这被认为是不好的做法。

是的。
ObjectOutputStream
不包含写入其中的对象的任何类字节码


但是,如果您使用RMI在另一台机器上调用方法,您可以使用动态类加载,这允许一台机器从另一台机器甚至第三台机器加载代码。

是。
ObjectOutputStream
不包含写入其中的对象的任何类字节码



但是,如果您使用RMI在另一台机器上调用方法,您可以使用动态类加载,这允许一台机器从另一台机器甚至第三台机器加载代码。

是的,它可以。java不发送类实现;因此,必须导入对象类型的所有声明。否则就没有办法告诉你如何反序列化。@Luke不,你不必那样做。您可以单独通过接口引用它。所以这不是原因。@Robin我不确定我是否知道你的意思。你能举个例子吗?@Luke假设问题中的代码,
Business obj=(Business)objectInputSteam.readObject()而且你不必通过接口引用它,理论上你甚至可以把所有的东西都作为一个对象引用。是的,它是这样的。java不发送类实现;因此,必须导入对象类型的所有声明。否则就没有办法告诉你如何反序列化。@Luke不,你不必那样做。您可以单独通过接口引用它。所以这不是原因。@Robin我不确定我是否知道你的意思。你能举个例子吗?@Luke假设问题中的代码,
Business obj=(Business)objectInputSteam.readObject()你也不必通过接口引用它,理论上,你甚至可以将所有东西都作为对象引用。你能举一个例子说明当接口扩展Serializable会对你造成伤害吗?@Luke的想法是,除非你有充分的理由,否则你不应该将Serializable强加给实现者。我能想到这种情况,但这应该是一种有意识的选择。“不,除非”是我的启发。(正如你所问,我知道这不是一个真实的例子。希望它仍然有用。)好的,不“将可序列化性强加于实现者”的想法是因为并不总是清楚您是否需要处理所有无法在实现者中序列化的文件或其他原因?您能举一个例子说明扩展可序列化的接口会对您造成伤害吗?@Luke的想法是您不应该将其强加于实现者除非您有充分的理由这样做,否则实现者的可序列化性。我能想到这种情况,但这应该是一种有意识的选择。“不,除非”是我的启发。(我知道这不是一个真实的例子,正如你所问。希望它仍然有用。)好的,不“对实现者强加可序列化性”的想法是因为并不总是清楚你是否需要处理所有不能在实现者中序列化的文件或其他原因?非常感谢,伙计,是否可以将已由类版本1封送到类版本2的对象解组?并且假设两个类都有相同的串行版本uid。非常感谢,伙计,有没有可能将一个对象从类版本1封送到类版本2?并假设两个类具有相同的串行版本uid。