问题标签 [kryo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
10389 浏览

java - Kryo 中的自动课程注册

className据我了解,KryonumberID在每个writeObject. 这张地图太窄了。因为在您的对象模型中,实例往往属于相同的类,接下来 writeObject 将再次构建和序列化类似的映射(一次又一次,一次又一次)。我知道可以通过手动注册类来共享地图,但这是繁琐的手动硬编码。我希望映射将由第一个对象写入启动,就像它通常那样,但是会话中的所有后续写入都将重用和扩展它。这样,注册将在运行时自动发生,没有额外的运行时开销,更频繁使用的对象自然会收到低 ID 号。该映射可以在之后单独存储在附件中,作为解密密钥。反序列化器将从加载此映射开始。你喜欢这个想法,如何实施?

我的问题类似于 使用 kryo 注册类的策略,其中用户可以使用列表将所有写入组合在单个 writeObject 下。正如我建议的那样,它甚至比单独存储地图更简单。但是,他似乎并不想这样做。就我而言,这种组合甚至是不可能的,因为大型 java 模型我避免通过分段序列化将其完全保存在内存中。在我的场景中,用户打开一个项目,进行更改并刷新它们。因此,该项目可以维护类映射并将其用于所有序列化。

更新!我意识到有类/对象注册器和自动重置。它们似乎是为这项任务而创建的。但是,我不明白这些事情如何解决它。Autoreset=false确实使第二次写入要小得多。但是,在这种情况下,我无法反序列化对象。正如您在示例中看到的,第二次反序列化失败:

输出是

Update2除了类名之外,autoReset=false 还可能记录对象引用。确实值得自动重置。

Update3我发现很难序列化类的映射(即类 -> 注册),因为注册包含引用 kryo 对象并保持某些状态的序列化程序。那时很难在许多 kryo 对象之间共享地图。

0 投票
1 回答
729 浏览

kryo - Kryo 中的序列化事件

你如何接收序列化事件?你可以定义

在 java 序列化中,当您的对象被序列化时将调用此方法。你如何在 Kryo 做同样的事情?两者都有默认序列KryoSerializableExternalizable的问题:一旦调用了事件处理程序,您就需要默认的读/写对象。但是没有这样的事情!? 您可以调用FieldSerializerinread(Kryo, Input)来读取对象的字段,但它会为您生成一个新对象,而不是填充当前对象。为此,我尝试引入一个自定义序列化程序:

但是,我提到通过 A 的子类接收serializationEvent()事件,只有 A.class 字段被序列化。因此,这不适用于class B extends A. 我还尝试了Natan 提出的解决方案:register(A.class, new FieldSerializer(A.class, myhandler。这会序列化所有字段,包括子类,但是根本不会为子类调用自定义序列化程序。因此,我决定 Kryo 自定义仅适用于最终课程。Nathan 说这个结论是“无效的”,而 KryoSerializable 解决方案是“特定于应用程序的”,否则认为是“粗鲁的”。尽管有这样的决心,我还是决定发表我发现的一般方法。

0 投票
1 回答
3421 浏览

java - Java 序列化、Kryo 和对象图

假设我在内存中有一个arr类型的对象数组A,每个对象都有一个指向同一个对象的引用字段B

插图:

请注意,每个 type 对象中的引用字段都A指向同一个type 对象B

arr现在,我将包含类型对象A的数组序列化为ObjectOutputStream. 然后我反序列化以这种方式获得的字节。

我得到一个新数组arr1

1)数组是否arr1有类型的对象,A使得它们都指向同一个类型的对象B?(我不是指序列化之前的同一个对象,而是新创建的唯一类型的对象B

2) 换句话说,在 Java 中调用 serialize/deserialize 是否保留与序列化之前相同的对象图?(即新反序列化的对象图与旧对象图同构)

3)这在哪里记录?(即请提供引用)

4) 相同的问题 1-3,但适用于 Java 的Kryo序列化框架。

谢谢你。

0 投票
3 回答
1104 浏览

java - How do I detect "End of File" in Kryo?

I'm reading an unknown number of objects from a gzipped file in Kryo:

The problem is: How do I detect when I've read the last object from the file? When I'm writing the objects I don't know in advance how many I will be writing, so I can't include a count of the objects at the start of the file.

I could have some kind of "dummy" object that I write at the end of the file to indicate that it's the last one, but that seems ugly.

0 投票
5 回答
4449 浏览

java - Kryonet 在连接后断开连接

我遵循了这个 Youtube 教程,涵盖了 Kryonet 的基础知识。

基本上它是一个 Kryonet Hello World,它解释了如何设置一个基本的服务器和一个客户端,允许客户端向服务器发送数据包并进行非常基本的通信。

源代码的链接。服务器和客户端都具有相同的数据包类。

我可以让服务器运行,客户端要求 IP 连接。但是,当我输入 IP 时,客户端在连接后立即终止。

客户端输出:

服务器命令行日志:

似乎系统关闭了 TCP 连接,但我真的不知道。我必须在 Windows 或/和路由器中启用某些东西以允许 Kryonet 通信吗?

有人能发现问题吗?提前致谢。

命令行日志中以西班牙语显示的行类似于“远程主机已强制中断现有连接”。

在 user1816380 建议后编辑:

大多数时候它仍然显示原始错误,但有时您会看到:

0 投票
2 回答
10241 浏览

java - kryo 列表序列化

我正在尝试使用 Kryo 序列化一些对象(自定义类: List> )的 List 列表。

到目前为止没问题,它写出没有错误的列表。但是当我尝试阅读它时:

我收到此错误:

我怎么解决这个问题?

0 投票
1 回答
2770 浏览

java - 在 Kryo 中序列化和反序列化对象数组

我最近一直在测试 Kryo 的序列化和反序列化,并且通常对它感到满意,但是尚不清楚如何处理包含对象数组的类的(反)序列化。该类包含最终字段,因此我似乎无法使用默认的 FieldSerializer(错误是“无法创建类(缺少无参数构造函数)”,但无参数构造函数不适合最终原语)。所以,给定班级

如何有效地编写一个序列化器/反序列化器来处理这个问题?我的假设是我在 com.esotericsoftware.kryo.io.Input 中遗漏了一些东西,这将让我在自定义序列化程序中执行此操作,但这可能是错误的轨道..

0 投票
2 回答
3134 浏览

java - Kryo 无法序列化 java.sql.Timestamp?

编辑:使用 Kryo 1.04

我现在正在序列化一个User包含java.sql.TimestampScala 字段的类。由于某种原因,Kryo 找不到零参数的构造函数并抛出错误:

这是为 Riak 转换域对象的转换器类的一部分。这是我的转换器类:

我是否需要扩展 Timestamp 并创建一个零参数构造函数?还是有更好的解决方法?

如果我需要升级到 2.20,ObjectBuffer不写入文件的替换是什么?

0 投票
1 回答
477 浏览

java - 如何在 RMI 中使用 Kryo

我看到很多关于是否可以使用 Kryo 来替换 RMI 使用的默认 JVM 序列化的问题,但没有关于如何实际设置它的方式。我听说 Kryo 是 JVM 序列化的“插入式”替代品,但不确定这是否意味着您可以从运行时类路径中换出一些 JAR(例如 SLF4J 绑定等),或者其他什么别的。

所以我问:我如何使用 Kryo 而不是 Java 附带的默认 JVM 序列化来获得 RMI?提前致谢!

0 投票
0 回答
2073 浏览

java - Java serialization of very large objects

I'm facing the following issue: I would like to serialize a very large object (several hundreds of MB in memory) to a file. As I understood that Kryo is one of the best serialization libraries out there, I've been using this to serialize my object:

This generates an OutOfMemory exception: I guess that the entire object is first serialized in memory before being written to file.

Hence my question: is there a way / library to serialize an entire object while it is written to file per chunks?

I would like to avoid the workaround of decomposing the object in smaller elements before serializing as:

  • I would like the serialization implementation to be independent of the data object structure
  • My object contains multiple references to the same objects. I suspect that if I serialize those elements independently, the serializer will instantiate them as different objects (consuming even more memory)

UPDATE: In the meanwhile I implemented a serialization approach where the different elements of the very large object are serialized one by one and this does indeed avoid the OutOfMemory exception.

However I'm afraid that with this approach I will loose advantage (in terms of memory footprint) of multiple references to a same object (i.e. those references will have their own instance of the object). Any idea on this?

New code snippet (where, for instance, field1 contains references to same objects than field2):

Any hint / help would be greatly appreciated! Thanks, Tom