栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

追加对象OutputStream时发生ClassCastException

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

追加对象OutputStream时发生ClassCastException

这里的问题是,以前给您提供附件的海报

ObjectOutputStream
使您误入歧途。一个
ObjectOutputStream
/
ObjectInputStream
试图存储每个对象只有一次,再后来重提已存储的对象。也就是说,在流中,如果您有一堆相同类的对象,则可以得到如下所示的结果:

CLASS_1_DEscriptIONOBJECT_1REF_TO_CLASS_1OBJECT_2REF_TO_CLASS_1OBJECT_3...

ObjectInputStream
将流转换回一堆对象时,它将维护已反序列化的内容的列表。它告诉您的错误是它试图对对象进行反序列化,读取了应该是对该对象类的描述的引用,但是当在其内部表中查找该引用时,它看到了一个
String
。很自然地,它炸了。

我认为解决方法很简单-在您中

AppendableObjectOutputStream
,更改此方法:

  @Override  protected void writeStreamHeader() throws IOException {    // do not write a header, but reset the handle list    reset();  }

中的

reset()
方法在
ObjectOutputStream
流中插入一个标记,表示“此时放弃所有状态”。然后,当您使用读回来时
ObjectInputStream
,输入流对反序列化的想法将与输出流首先对东西进行反序列化时所认为的状态相匹配。

(编辑:从评论中回答问题)

我能想到的唯一有害后果是:

  • 如果将所有内容全部写入一个文件,则最终文件将比原文件更长

    ObjectOutputStream
    ,尤其是同一
    Profile
    对象出现多次时。即使没有,您也将在流中重复类描述符,因此{open
    AppendableObjectOutputStream
    ,编写一个对象,close stream}的许多重复操作可能会使文件大小变大。

  • 与此相关的是,在对所有内容进行反序列化之后,您可能最终会获得原本应该是同一对象的多个副本。例如,假设您编写了一堆东西,包括一些

    PPRestrictedAccount
    对象,然后关闭流,将其作为打开
    AppendableObjectOutputStream
    ,并写出一个a
    PPBusinessAccount
    ,该
    operators
    列表中包含
    PPRestrictedAccount
    您先前写的一些s。当你阅读所有回的
    PPRestrictedAccount
    就是你读最初不会是相同的对象(也就是说,他们不会
    ==
    )的
    PPRestrictedAccount
    是你们等在找到
    PPBusinessAccount
    operators
    名单。它们将分别实例化。为避免这种情况,您需要使用
    readResolve
    方法对它们进行重复数据删除。一切都写到一个
    AppendableObjectOutputStream
    实例将正确连接。根据您的应用程序,这可能根本不用担心。

就遗嘱的安全性而言,这与java序列化的任何其他用法一样安全。没有任何关于您的类的具体信息可以使其正常工作。请注意,在输出文件的多个单独的开口中编写的任何对象都将反序列化为原始对象的单独副本。(没有任何

readResolve
魔法)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483469.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号