OpenNxSerialization
加速Java中的对象序列化。
引言
这是NxSerialization在CLR (.NET 和 Mono) 平台的Java版本,它是一个易于使用的对象序列化框架,可以替代默认序列化提供程序的功能。有关背景信息,请阅读本文 https://codeproject.org.cn/KB/dotnet/OpenNxSerialization.aspx。
快速事实
下图包含使用NxSerialization for Java 提供的示例应用程序的基准测试结果。测量的时间是100次迭代,每次迭代运行100次。在每次运行中,都会序列化和反序列化指定类型的对象。这些结果可能因系统配置而异;但是,重要的是考虑本机序列化和NxSerializer之间的相对差异或性能因素。
为什么需要Java版本?
最初没有计划发布NxSerialization的Java版本,因为与.NET和Mono不同,Java的本机序列化程序表现相当不错。NxSerialization for Java主要是出于两个目的而编写的。首先,作为一种概念验证,证明即使Java本机序列化也可以得到改进。其次,更重要的是,它为可移植的二进制序列化提供了一个启动平台;这是下一个流程中的项目。
然而,由于该项目离实现还很遥远,并且基于大众需求,NxSerialization for Java已发布供审查。对这个版本的期望不高,但仍然希望听到一些建议,并知道有人觉得它有用。
使用框架
应用程序对象可以通过两种方式与框架集成。通过为对象类型编写代理并向框架注册代理,或者通过实现INxSerializable
。该框架为实现INxSerializable
的类型提供内置代理。对于未知类型,使用本机.NET序列化。
以下代码示例演示了一个实现INxSerializable
的类型。请注意底部的行,它将类型注册到框架中。
// Registering a type with the framework
NxFormatterServices services = NxFormatterServices.getDefault();
services.registerKnownType(SampleClass.class);
// Registering a custom surrogate with the framework
services.getSurrogateSelector().register(new SampleSurrogate());
// Using NxObjectOutputStream for serialization
ObjectOutput writer = NxObjectOutputStream(new ByteArrayOutputStream());
writer.writeObject(sampleGraph);
writer.flush();
// Using NxObjectInputStream for deserialization
byte[] contents = writer.getBaseStream().toByteArray();
ObjectInput reader = NxObjectInputStream(new ByteArrayInputStream(contents));
Object read = reader.readObject();
其他一切都非常容易理解。有关更多信息,请查看随源代码提供的示例基准测试应用程序。
注释
请注意,对于实际数据大小与类型信息大小之比非常大的对象,不会发生太多的内存减少。尝试一个大小为100K的byte
数组。也有可能出现本机序列化在CPU方面实际上更有效的情况。
历史
OpenNxSerialization 1.0 (2009年6月15日)
- 发布了框架的初始版本。