【问题标题】:Serialization ObjectInputStream Invalid Stream Header: 00000000序列化 ObjectInputStream 无效的流标头:00000000
【发布时间】:2014-09-24 06:38:54
【问题描述】:

对于特定要求,我必须在不同机器中的多个 tomcat 实例之间共享简单的 Java 缓存对象。为此,我尝试序列化缓存对象并将其保存在共享目录中。 此缓存对象将在继续执行某些操作之前由所有实例引用[deserialized/readobject],并在处理操作之后由所有实例更新/覆盖[serialize/writeobject]。 在内部,我将在序列化/反序列化之前创建一个标志文件[空一个],并将在序列化/反序列化之后将其删除。因此,如果标志文件可用,则缓存一个实例正在使用的对象,因此其他实例应该等待处理。

当负载最小时它可以工作,但是当负载更高时我开始得到 .我相信这可能是因为僵局。有没有办法确保单个文件的同时处理不会导致这个问题。我不能使用 Java 同步,因为它特定于实例。非常感谢您的帮助。

java.io.StreamCorruptedException: invalid stream header: 00000000
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:277)

【问题讨论】:

    标签: java caching serialization deserialization objectinputstream


    【解决方案1】:

    通过文件共享数据可能很棘手。您可能会考虑使用Chronicle Map,它旨在在进程之间共享持久数据,但无需以线程安全的方式创建和删除文件。

    【讨论】:

    • 顺便说一句,我想避免引入第三方工具并尝试解决方法。
    • @popeye.sailor 在这种情况下,最简单的解决方案可能是; a)使用锁定文件,b)先写入临时文件,完成后将其重命名为原始文件。
    • 是的,这可能是下一次尝试 :)
    猜你喜欢
    • 2021-04-29
    • 2016-02-10
    • 1970-01-01
    • 2014-04-24
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多