性能更好的Java序列化替代方案

性能更好的Java序列化替代方案,java,performance,serialization,Java,Performance,Serialization,假设我使用标准Java对象序列化在内存缓冲区中写入/读取小型(

假设我使用标准Java对象序列化在内存缓冲区中写入/读取小型(<1K)Java对象。最关键的部分是反序列化,即从内存缓冲区(字节数组)读取Java对象


对于这种情况,有没有比标准Java序列化更快的替代方案

标准序列化添加了大量类型信息,然后在反序列化对象时对这些信息进行验证。当您知道要反序列化的对象的类型时,通常不需要这样做

您可以做的是为每个类创建自己的序列化方法,该方法只将对象的所有值写入字节缓冲区,以及一个构造函数(或工厂方法,当您以这种方式摆动时),该构造函数接受这样一个字节缓冲区并从中读取所有变量

但就像亚历克斯一样,我想知道你是否真的需要它。通常只有当数据离开程序时才需要序列化(例如存储在磁盘上或通过网络发送到另一个程序)。

请看一看。 它比内置的序列化机制(写出大量字符串并严重依赖反射)快得多,但使用起来有点困难。

编辑:下面是R.Moeller的建议,我以前从未听说过它,但它看起来比kryo更快,并且与java内置序列化兼容(这将使它更易于使用),所以我想看看第一个java的标准序列化速度很慢,并且在磁盘上使用大量字节。自定义序列化非常简单。
JavasSTD序列化对于演示项目来说很好,但由于上述原因,并不适合专业项目。您无法控制进一步的版本控制。

java提供了定制序列化所需的一切,请参阅我在

使用这种方法,您甚至可以指定二进制文件格式,这样在C或C中也可以读入。 另一个优点是自定义设置的对象需要的空间比主内存中的小(布尔值在主内存中需要4个字节,但自定义序列化时仅需要1个字节(作为字节)


如果不同的网络项目合作伙伴必须阅读您的序列化数据,谷歌Protobuf是一个替代方案。

试试或者。

您可能还想看看


还为堆外读/写提供工具

为什么不尝试协议缓冲区之类的东西呢?在大多数情况下,它比本机Java序列化更快,这正是我想要使用它的目的。我开始使用它来处理非常简单的用例,但它慢慢地发展成为我参与的项目中的一个主要部分,主要用于创建合同。我绊倒了在这个问题上,因为我问自己同样的问题。如果有指标可以比较(我肯定有人做过这样的事情)-然后这个问题可以用事实来回答,而不是观点。这不是问题的问题-而是答案的问题。如果我错了,请纠正我-否则我将编辑问题,使其符合标准以重新打开它。例如,序列化对象仍将包含完全限定的类名字符串,并且序列化仍将保留(相对而言)慢,因为它必须检查并查看您是否序列化,或者在您建议的情况下是否可以外部化我不是建议覆盖标准序列化方法-我是建议创建一个全新的序列化机制,它不使用标准。哦,抱歉,那么,在这种情况下,我不得不说轮子已经被我Nvent(kryo等)谢谢。你知道为什么kryo更快吗?它们有什么不同吗?java内置的序列化机制在每个序列化实例的开头写下完全限定的类名-否则它在反序列化时不知道它在看什么。kryo可能(可选)注册()已知类(如果您事先知道要读取/写入的类型),并且可以使用较小的int头而不是FQCN-因此大小较小。您还可以为类注册序列化程序,避免反射查找(可序列化接口、序列化注释等)-更快的io.kryo不处理对象版本(默认情况下,与serialVersionUID相比)-又快了。另外,当反序列化内置机制需要使用FQCN调用Class.forName()时-比注册处理程序的映射慢。非常喜欢FST。谢谢!哇,对于我的用例,我只是将大型对象的反序列化时间从30秒缩短到4秒(另外,作为奖励,序列化形式更小)如果你依赖于项目中的JDK序列化,这个LIB绝对是必须的尝试!ProtoBuf本身不是序列化程序。它是创建原始BuffF类对象的消息格式。对于创建这些对象,它使用默认运行的语言的SerDes,例如,如果使用C++,那么它将使用DEFA来使用C++。ult。如果您使用java,那么在后端,它使用java SerDes来创建这些消息。另一方面,Kryo是SerDes,速度非常快。它通常在spark中用作SerDes,有时用于创建proto/avro类型的对象。