Java中的部分反序列化和序列化?

Java中的部分反序列化和序列化?,java,performance,serialization,Java,Performance,Serialization,Java中有大量的库和方法来序列化和反序列化对象。 我想做的是涉及相当大和复杂的对象,它们需要在处理节点之间来回发送 然而,每个节点只对整个对象的一个或几个部分感兴趣,通常是小部分。处理节点处理该零件并创建一个新零件,该零件在发送之前需要拼接到现有的序列化对象中 为此,有两件事非常重要: 能够仅对序列化对象的部分进行反序列化(从而节省解析/反序列化时间、对象创建时间、内存…),并且还可以将某些新部分的序列化添加到现有的序列化对象中(再次节省时间和内存)--跳过序列化版本中不需要的部分应该是非常

Java中有大量的库和方法来序列化和反序列化对象。 我想做的是涉及相当大和复杂的对象,它们需要在处理节点之间来回发送

然而,每个节点只对整个对象的一个或几个部分感兴趣,通常是小部分。处理节点处理该零件并创建一个新零件,该零件在发送之前需要拼接到现有的序列化对象中

为此,有两件事非常重要:

  • 能够仅对序列化对象的部分进行反序列化(从而节省解析/反序列化时间、对象创建时间、内存…),并且还可以将某些新部分的序列化添加到现有的序列化对象中(再次节省时间和内存)--跳过序列化版本中不需要的部分应该是非常快速和高效的,理想情况下应该可以在流模式下进行,而不需要立即将整个序列化数据保存在内存中
  • 整体紧凑且快速的序列化和反序列化
对于实际创建类型化对象与非类型化映射和列表的自动化程度,我非常灵活:如果所有其他操作都失败,我将能够将整个对象表示为一个嵌套的数据结构,其中只包含映射、数组和基本数据类型布尔、字符串和数字

更新:忘记提及两个额外的、相当重要的要求:

  • 解决方案必须能够与现有对象一起使用,即不可能使用不同的集合类重新实现当前对象

  • 理想情况下,解决方案应该基于开源软件,因为我需要的软件将以开源的形式发布


听起来您正在计划一种设计,将一整组数据发送到处理节点,而该节点只读取/修改/写入其中的一小部分。然后将整个包发送到另一个节点

为什么不让拥有所有数据的主机找出哪个节点需要哪些数据,然后只发送这些数据呢?然后处理可以并行进行,而不是菊花链。并且,您的总网络流量将小于每个发送所有内容的完整副本的节点:O(n*m)


您可能需要设计自己的消息格式,可能基于JSON、二进制或其他格式。

听起来您正在计划一种设计,将一整组数据发送到处理节点,而该节点只读取/修改/写入其中的一小部分。然后将整个包发送到另一个节点

为什么不让拥有所有数据的主机找出哪个节点需要哪些数据,然后只发送这些数据呢?然后处理可以并行进行,而不是菊花链。并且,您的总网络流量将小于每个发送所有内容的完整副本的节点:O(n*m)



可能值得设计您自己的消息格式,可能基于JSON、二进制、,或者别的什么。

是否可以将复杂对象分解为多个部分并序列化各个部分?您是否研究过外部化?有许多库允许您就地使用序列化对象提取或更新感兴趣的字段。编年史字节/连线,SBE,Javolution结构。@Vince Emigh:据我所知,外部化基本上解决了编译时的问题,对于一个特定的数据子集,但我需要能够在运行时做到这一点,对于同一个对象的多个子集:如果我将对象发送到节点A,我想查看对象的第1部分和第2部分并添加第a部分和节点B可能想访问第3部分并添加第B1部分和第B2部分。是否可以将复杂对象分解为多个部分并序列化各个部分?您是否研究过外部化?有许多库允许您就地使用序列化对象或进行提取只更新您感兴趣的字段。编年史字节/连线,SBE,Javolution结构。@Vince Emigh:据我所知,外部化基本上解决了编译时的问题,对于一个特定的数据子集,但我需要能够在运行时做到这一点,对于同一个对象的多个子集:如果我将对象发送到节点A,我想查看对象的part1和part2并添加partA和node B可能希望访问part3并添加partB1和partB2。这是不可能的,因为只有处理节点才知道它要查看的部分和它要添加的部分。数据的实际大小并不是真正的问题,但复杂性在于:完全对象的反序列化将花费大量时间,因为可能有数百万个小型嵌套部分需要解包,但是大多数都与节点无关。@Johsm:hmm.IDK如果你真的想继续使用标准的序列化/反序列化,除了额外的往返:服务器告诉节点它想要节点做什么。节点请求数据集的特定部分。服务器发送它,等等。TBH我原以为只查看序列化对象的一部分的要求会更常见,这样就有了一个标准解决方案。如果不是,我会自己做饭,但如果重新发明一个现有的轮子,那将是一个遗憾。@Johsm:为了使部分反序列化有效,你需要某种索引,不是吗?否则,接收方仍然必须解析所有序列化数据,而不是从中创建对象。IDK,可能有一种方法可以通过一些标准API实现这一点。我不知道怎么做,但我不是专家。我只是提出了一个更有效的解决方案。希望这不会吓跑那些对序列化API/库有更多经验的人的答案