java - 如何在不实际序列化对象的情况下估计 Java 中对象的序列化大小?

标签 java serialization scala

要增强集群中的消息传递,重要的是要在运行时了解消息的大小(我应该更喜欢本地处理还是远程处理)。

我只能找到有关基于 Java 检测估计对象内存大小的框架。我已经测试了 classmexer,它没有接近序列化大小和 sourceforge SizeOf。

在一个小型测试用例中,SizeOf 的错误率大约为 10%,而且比序列化快 10 倍。 (仍然 transient 完全打破了估计,因为例如 ArrayList 是 transient 的但被序列化为数组,修补 SizeOf 并不容易。但我可以接受)

另一方面,10% 错误率的 10 倍速度似乎不太好。我有什么想法可以做得更好吗?

更新:我还测试了 ObjectSize ( http://sourceforge.net/projects/objectsize-java )。结果似乎只适用于非继承对象:(

最佳答案

类在运行时占用的大小不一定与其在内存中的大小有任何关系。您提到的示例是 transient 字段。其他示例包括对象何时实现 Externalizable 并自行处理序列化。

如果一个对象实现了 Externalizable 或提供了 readObject()/writeObject() 那么你最好的办法是将该对象序列化到一个内存缓冲区以找出大小。它不会很快,但会很准确。

如果对象使用默认序列化,那么您可以修改 SizeOf 以考虑 transient 字段。

在序列化许多相同类型的对象之后,您可以为该类型建立一个“序列化配置文件”,将序列化大小与来自 SizeOf 的运行时大小相关联。这将允许您快速估计序列化大小(使用 SizeOf),然后将其与运行时大小相关联,以获得比 SizeOf 提供的结果更准确的结果。

关于java - 如何在不实际序列化对象的情况下估计 Java 中对象的序列化大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3069018/

相关文章:

java - 对长类型检测的疑问

c++ - boost 空 std::forward_list 的序列化

scala - 在 Scala 中,使用下划线进行闭包的规则是什么?

mongodb - 如何使用ReactiveMongo指定replicaSet名称?

java - 错误 yarn.ApplicationMaster : User class threw exception: java. lang.NoClassDefFoundError: scala/Function0$class

java - JSR-303 类型 java 字段验证是否始终/隐式在字段验证之前运行?

java - "Hello world"android项目,直接来自书籍,有时会产生ActivityNotFoundException

java - "cannot find symbol [method name]"尽管声明了该方法

c# - 序列化时我犯了什么错误?

java - 使用序列化java保存游戏(扫雷)进度