我知道至少有两个字节码增强器在运行时修改“对象模型”以允许事务透明地执行。其中之一是Versant VOD的一部分,我每天都在工作中使用,另一部分是兵马俑的一部分。例如在ORM中可能有不少其他人,但Versant会在我的公司处理此事。有没有对象更改跟踪/版本控制的Java API?
我的问题是,是否有这样一个开源的API,可以独立使用,独立于它设计的产品?你可以说一个“hackable”的API。它应该只跟踪变化,而不是读取访问,这将显着减慢代码。换句话说,它不应该要求明确的读/写锁定。这需要访问执行更改的所有类,而不仅仅是访问数据模型,或者需要在内存中保留某种形式的“先前版本”以进行比较。
我试图解决的问题是,我有“大”(32K到256K)的“NoSQL”数据库中“序列化”的对象图。它们是长寿的,必须定期重新序列化,以便有变化的“历史”。但是,它们的序列化相当昂贵,大部分更改都很小。
我可以每次完全序列化它们并在流上运行二进制比较,但这听起来非常耗费CPU资源。一个更好的解决方案是修改模型上的写操作以协调更改,以便在初始“映像”存储后,只需要存储协议。
我发现了一些关于Apache Commons Beanutils来比较对象的问题,但这对于就地更改没有用;我需要在每个“业务交易”之间对模型进行完整的克隆。
重申,我正在寻找一个“内存中”的API,在同一个JVM中,它不涉及任何外部服务器应用程序。如果可用于Win,Mac & Linux,则涉及本机代码的API可以。该API不必独立地打包;只需从“父项目”中提取它就可以形成独立的API(父项目许可证必须允许这样做)。
我的对象图将涉及许多大型数组,因此需要得到有效支持。
这些更改不仅仅适用于审核,而且可以重播或撤销。更确切地说,通过反序列化的初始图和一系列更改,我应该得到一个完全相同的最终图。另外,从结束图开始,应该可以通过反向应用更改返回到初始图。这使用完全相同的功能,但需要更改协议以保留旧值和新值。
API许可证应与商业用途兼容。
[编辑]到目前为止,我没有得到有用的的答案,它似乎并不像我想要的那样存在。这让我只有一个选择:做到这一点。当我有一个工作实现时,我会在这里发布一个链接作为答案,因为这是我项目中的下一步,如果没有它,我不能前进。
[编辑]我偶然发现这个有点相关的问题:Is there a Java library that can "diff" two Objects?
不完全确定你在做什么。但它的声音类似于颠覆。如果这些对象被序列化为一个文件,那被检入到SVN中,那么更改历史将会在那里。如果您是通过编程访问更改,则不是非常有用。你需要什么? – scorpdaddy 2012-05-03 20:49:25
哈哈!我明白你的意思,但这根本不适合我的用例。首先,我应该都是“内存中”的,而不是基于客户端服务器的,其次,所有RCS在二进制数据上本质上都是不好的,这正是我试图编写的版本。这里没有涉及XML或JSON。我会更新这个问题。 – 2012-05-04 10:37:14
我不知道任何这样的API,但也许你可以按顺序思考。听起来,它实际上是您的应用程序的要求,而不是尝试透明API方法。您可以将初始图形存储一次,然后使用版本和新数据构建一棵树。 – 2012-05-04 11:28:42