我知道至少有两个字节码增强器在运行时修改“对象模型”以允许透明地执行事务。其中一个是我每天在工作中使用的 Versant VOD 的一部分,另一个是 Terracotta 的一部分。可能还有很多其他的,例如在 ORM 中,但 Versant 在我的公司负责处理。
我的问题是,是否有这样一个可以独立使用的开源 API,独立于它所设计的产品?你可以说一个“可破解”的 API。它应该只跟踪更改,而不是读取访问,这会显着减慢代码速度。换句话说,它不应该需要显式的读/写锁定。这需要访问所有执行更改的类,而不仅仅是数据模型,或者需要在内存中保留某种形式的“先前版本”以进行比较。
我要解决的问题是我在(NoSQL)数据库中“序列化”了“大”(32K 到 256K)对象图。它们是长期存在的,必须定期重新序列化以获取更改的“历史”。但是它们的序列化相当昂贵,而且大多数更改都是很小的。
我每次都可以完全序列化它们并在流上运行二进制差异,但这听起来非常占用 CPU。更好的解决方案是修改模型上的写操作以对更改进行协议的 API,以便在存储初始“图像”之后,只需要存储协议。
我发现了一些关于 Apache Commons Beanutils 来比较对象的问题,但这对于就地更改没有用;我需要在每个“业务交易”之间对模型进行完整的克隆。
重申一下,我正在寻找一个“内存中”API,在同一个 JVM 中,它不涉及任何外部服务器应用程序。如果在 Win、Mac 和 Linux 上可用,涉及本机代码的 API 是可以的。API 目前不必独立打包;它只需要可以从“父项目”中提取它以形成一个独立的 API(父项目许可证必须允许这样做)。
我的对象图将涉及许多大型数组,因此需要有效地支持。
这些更改不仅用于审计,而且可以重放或撤消。更准确地说,使用反序列化的初始图和更改列表,我应该得到一个相同的结束图。此外,从结束图开始,应该可以通过反向应用更改返回到初始图。这使用完全相同的功能,但除了新值之外,还需要更改协议来保留旧值。
API 许可应与商业用途兼容。
[编辑] 到目前为止,我没有得到有用的答案,而且我想要的似乎也不存在。这让我只有一个选择:让它发生。当我有一个有效的实现时,我会在此处发布一个链接作为答案,因为这是我项目的下一步,没有它我无法继续前进。
[编辑] 我偶然发现了这个有点相关的问题:是否有一个 Java 库可以“区分”两个对象?