gpt4 book ai didi

java - 实现类的接口(interface)引用的序列化在反序列化时失败

转载 作者:行者123 更新时间:2023-12-01 16:03:14 25 4
gpt4 key购买 nike

我会尝试尽可能简洁明了地解释我的问题。我觉得我正在尝试的事情可能本质上是错误的,但不知何故我相信它应该有效。因此,请随意将这篇文章视为对序列化机制的简单说明。

所以,我有一个由类实现的接口(interface)[这意味着它们存在于单独的文件中]。

// ----- SomeInterface.java
public interface SomeInterface extends Serializable
{
public void setMsg(String msg);
public void printMsg();
}

// ----- SomeImpl.java
public class SomeImpl implements SomeInterface
{
private String msg;
public void setMsg(String msg)
{
this.msg = msg;
}


public void printMsg()
{
System.out.println("Msg is: " +msg);
}

}

现在我序列化 [tt]SomeImpl[/tt]类的实例:

...
public void SomeMethInSomeClass()
{
FileOutputStream fos = new FileOutputStream(new File("c:/test.ser"));
ObjectOutputStream oos = new ObjectOutputStream(fos);
SomeInterface si = new SomeImpl();

si.setMsg("blah blah");
oos.writeObject(test);

oos.close();
fos.close();
System.out.println("------ done -------");
}

现在,在一个单独的项目中,我有一个上述应用程序的 JAR,其中包含接口(interface) SomeInterface,但不包含实现类 SomeImpl。在此应用程序中,如果我尝试执行以下操作:

....
....
public void deserialiserMethod() throws Exception
{
FileInputStream fis = new FileInputStream(new File("c:/test.ser"));
ObjectInputStream ois = new ObjectInputStream(fis);
SomeInterface si = null;

System.out.println("------ reading ----------");
si = (SomeInterface) ois.readObject();
si.printMsg();
System.out.println("------- done ----------");
ois.close();
fis.close();
}
....

...我收到一个 ClassNotFoundException [for SomeImpl]。现在我知道我的其他项目的类路径中没有 SomeImpl 类。但是,不应该转换为父接口(interface)的引用来处理这种依赖关系吗?

感谢您的投入!

最佳答案

这不是转换的问题,这是序列化对象的类类型的问题。即使您的代码从不直接引用 SomeImpl 类也没关系,事实是序列化对象仍然是该类型。

考虑一下 - 如果不是 SomeImpl,反序列化对象将是哪个类的实例?这些字段必须在某处定义,如果不在 SomeImpl 中定义,那么在哪里定义?

即使您要反序列化该对象并将其转换为 java.lang.Object,您也必须面对同样的问题:该对象的实际表示形式和运行时类型是什么。

关于java - 实现类的接口(interface)引用的序列化在反序列化时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com