gpt4 book ai didi

java - FST 可以很好地(反)序列化为 JSON,但默认配置存在问题

转载 作者:行者123 更新时间:2023-12-02 02:28:20 28 4
gpt4 key购买 nike

我们使用 FST(快速序列化)将大量对象同时放入磁盘,然后读取它们。对象本身具有复杂的结构,并且包含不包含的内容:基元、复杂类型、数组及其集合。问题是,使用默认的 FST 配置 (FSTConfiguration.createDefaultConfiguration()),我们会遇到如下反序列化异常:

java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
at org.nustaq.serialization.FSTObjectInput.readObjectCompatibleRecursive(FSTObjectInput.java:609) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectCompatibleRecursive(FSTObjectInput.java:598) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectCompatible(FSTObjectInput.java:574) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.instantiateAndReadNoSer(FSTObjectInput.java:559) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:374) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectInternal(FSTObjectInput.java:331) ~[fst-2.55.jar:na]
at org.nustaq.serialization.serializers.FSTCollectionSerializer.instantiate(FSTCollectionSerializer.java:92) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.instantiateAndReadWithSer(FSTObjectInput.java:501) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:370) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectFields(FSTObjectInput.java:712) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.instantiateAndReadNoSer(FSTObjectInput.java:566) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:374) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObjectInternal(FSTObjectInput.java:331) ~[fst-2.55.jar:na]
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:311) ~[fst-2.55.jar:na]
at com.agilertech.graph.dao.disk.readers.EntityStorageReader.readObject(EntityStorageReader.java:21) ~[main/:na]
...our code there...
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_91]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[na:1.8.0_91]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_91]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[na:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_91]
at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_91]
Caused by: java.io.InvalidObjectException: can't deserialize enum
at java.lang.Enum.readObject(Enum.java:251) ~[na:1.8.0_91]
... 35 common frames omitted

这种情况发生的概率大约为 100 次。尽管如此,如果切换到 JSON 配置 (FSTConfiguration.createJsonConfiguration()),所有问题都会消失 - 在序列化(反)序列化过程中根本没有异常(exception)。

我试图通过调试找到根本原因,看起来在某些情况下 FST 会出于某种原因切换到 useCompatibleMode,然后尝试通过反序列化来实例化 Enum。我还尝试重现此问题作为测试,但没有得到任何运气 - 我正在创建的类似数据结构不会导致此类问题。

我们的域结构是否存在问题/FST 使用不当,或者可能是一个错误?

请注意,我们使用的所有域类都正确实现了Serialized

最佳答案

当我通过套接字发送序列化对象时,我遇到了类似的错误。我发现以下文档解决了我的问题(基本上发送大小,然后发送对象)。

巨大对象/分块、流式 I/O:

一旦关闭/刷新 FSTOutputStream,编码的对象就会写入底层流。反之亦然,FSTInput 以 block 的形式读取底层流,直到开始解码。这意味着您无法直接从阻塞流中读取(例如,由 Socket 返回)。 Example on how to solve this.

据我所知,对于非常大的对象图,用户仍然更喜欢 FST。然后最大大小由 int 索引确定,因此对象图的最大大小约为 1.5 GB。

关于java - FST 可以很好地(反)序列化为 JSON,但默认配置存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47497302/

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