Я знаю, по крайней мере, два усилителя байт-кода, которые изменяют "объектную модель" во время выполнения, чтобы транзакция выполнялась прозрачно. Один из них является частью Versant VOD, который я использую на работе каждый день, а другой является частью Terracotta. Есть, вероятно, немало других, например, в ORM, но Versant позаботится об этом в моей компании.
Мой вопрос: есть ли такой API с открытым исходным кодом, который можно использовать на нем самостоятельно, независимо от продукта, для которого он был разработан? Вы можете сказать "hackable" API. Он должен отслеживать изменения, а не читать доступ, что значительно замедлит работу кода. Другими словами, он не требует явной блокировки чтения/записи. Для этого требуется либо доступ ко всем классам, которые выполняют изменения, а не только к модели данных, или для сохранения сравнения в памяти требуется некоторая форма "предыдущей версии".
Проблема, которую я пытаюсь решить, заключается в том, что у меня есть "большие" (32K до 256K) графы объектов, которые "сериализованы" в (NoSQL) DB. Они долговечны и должны быть повторно сериализованы регулярно, чтобы иметь "историю" изменений. Но они довольно дороги для сериализации, и большинство изменений незначительны.
Я мог бы последовательно их сериализовать и запускать двоичный diff в потоке, но это очень интенсивно. Лучшим решением будет API, который изменит операции записи в модели на протокол, чтобы изменения, так что после того, как начальное "изображение" будет сохранено, необходимо сохранить только протокол.
Я нашел несколько вопросов о Apache Commons Beanutils для сравнения объектов, но это не полезно для изменений на месте; Мне нужно было бы сделать полный клон модели между каждой "бизнес-транзакцией".
Повторяю, я ищу "встроенный" API в рамках той же JVM, которая не связана с каким-либо внешним серверным приложением. API, содержащие встроенный код, в порядке, если они доступны в Win, Mac и Linux. API не должен быть в настоящее время упакован независимо; просто нужно извлечь его из "родительского проекта" для создания независимого API (лицензия родительского проекта должна разрешить это).
Графики объектов будут включать в себя множество больших массивов, и поэтому их необходимо поддерживать эффективно.
Изменения не желательны только для аудита, но для их повторного воспроизведения или отмены. Точнее, с десериализованным начальным графом и списком изменений я должен получить одинаковый конечный граф. Кроме того, начиная с конечного графика, должно быть возможно вернуться к первоначальному графику, применив изменения в обратном порядке. Это использует точно такую же функциональность, но требует, чтобы протокол изменений сохранял старое значение в дополнение к новому значению.
Лицензия API должна быть совместима с коммерческим использованием.
[EDIT] До сих пор я не получил полезного ответа, и мне кажется, что я не хочу. Это оставляет мне только один вариант: сделайте это. Я отправлю ссылку здесь как ответ, когда у меня будет рабочая реализация, так как это следующий шаг в моем проекте, и я не могу идти вперед без него.
[EDIT] Я случайно обнаружил этот несколько смежный вопрос: Есть ли библиотека Java, которая может "diff" два объекта?