Java 如何将文件反序列化到不同的类
我将Java 如何将文件反序列化到不同的类,java,file,serialization,package,deserialization,Java,File,Serialization,Package,Deserialization,我将ArrayList列表序列化为一个文件,并将该文件传输到另一台机器中的另一个系统 由于接收文件的系统不同,我没有相同的packageA.Changelog类,而是一个packageB.Changelog,它的结构完全相同,但在不同的包中 当我使用 ArrayList changelogs=(ArrayList)ois.readObject() 为了从文件中读取,我得到了一个ClassCastException 如何避免这种例外?我是否需要在另一个系统中仅为接收列表而创建相同的包结构 是的,你
ArrayList列表
序列化为一个文件,并将该文件传输到另一台机器中的另一个系统
由于接收文件的系统不同,我没有相同的packageA.Changelog
类,而是一个packageB.Changelog
,它的结构完全相同,但在不同的包中
当我使用
ArrayList changelogs=(ArrayList)ois.readObject()代码>
为了从文件中读取,我得到了一个ClassCastException
如何避免这种例外?我是否需要在另一个系统中仅为接收列表而创建相同的包结构 是的,你可以做三件事中的一件
使用相同的包名创建相同的类
创建一个接口(当然,在两台机器上都在同一个包中)并在客户机上发布。即使在不同的包中,您的所有类都可以实现此接口。例如,您的接口可以命名为Loggable,并且应该声明ChangeLog类中的所有方法
最后,不要使用“ChangeLog”类,而是完全避免使用它,而是使用默认可序列化的HashMap。您不必将任何东西发送到您的客户机(其他)上。您将能够序列化ArrayList并将其转换回其他计算机上的对象
所有实现类Loggable的类都可以转换为该类型。
我希望这有帮助
我没有相同的packageA.Changelog
类,而是一个packageB.Changelog
,它具有完全相同的结构,但在不同的包中
为什么??这就是问题所在。不要这样做。通常序列化对象是基本数据类型。列表中包含什么。请尝试序列化arraylist中的所有对象,然后重试。类Changelog中的字段只是一些字符串和日期,但数据字符串中可能包含一些XML结构,所以我尝试序列化整个类以避免逃逸特殊字符。@Gustly:你在说什么?序列化肯定可以写入引用类型。对于序列化,可以使用XStream()库。它比标准java序列化灵活得多。在您的例子中,您可以在两侧向类添加@XStreamAlias注释,并克服不同类名的问题。谢谢!我将选择第三种方法,因为Changelog类非常简单,可以这样做。正在序列化的实际类必须存在于目标中。使用接口可以消除这种限制。这是两个试图协作的独立程序。@Paŭlo Ebermann不,它们不是独立的。您正在尝试将数据从一个序列化到另一个。所以他们需要共享类来实现这一点。我没有投反对票,但你的答案可以更详细一点——例如,添加评论中的信息(回复我的评论)会有所帮助。事实上,它只说“在不同的包中使用相同的命名类是个坏主意”,这既不正确也不能回答问题。@PaŭloEbermann我没有说这是个“坏主意”。我说这是问题的根源。从任何定义上来说,这都是一个答案。这也是事实,这使它成为一个正确的答案。否决正确答案对我来说没有任何意义,也没有留下任何解释。