Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将文件反序列化到不同的类_Java_File_Serialization_Package_Deserialization - Fatal编程技术网

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我没有说这是个“坏主意”。我说这是问题的根源。从任何定义上来说,这都是一个答案。这也是事实,这使它成为一个正确的答案。否决正确答案对我来说没有任何意义,也没有留下任何解释。