Conosco almeno due enhancer di codice byte che modificano il "modello oggetto" in fase di runtime per consentire l'esecuzione della transazione in modo trasparente. Uno di questi è parte di Versant VOD, che uso ogni giorno al lavoro e l'altro fa parte di Terracotta. Probabilmente ce ne sono molti altri, ad esempio in ORM, ma Versant si occupa di questo nella mia azienda.Esiste una API Java per il rilevamento/modifica delle versioni degli oggetti?
La mia domanda è: esiste una tale API open source che può essere utilizzata autonomamente, indipendentemente dal prodotto per cui è stata progettata? Potresti dire un'API "hackerabile". Dovrebbe solo tenere traccia delle modifiche , non leggere l'accesso, il che rallenterebbe significativamente il codice. In altre parole, non dovrebbe richiedere un blocco esplicito di lettura/scrittura. Ciò richiede l'accesso a tutte le classi che eseguono modifiche, non solo al modello di dati, o richiede di mantenere una qualche forma di "versione precedente" in memoria per fare un confronto.
Il problema che sto cercando di risolvere è che sono presenti grafici "grandi" (da 32K a 256K) che sono "serializzati" in un DB (NoSQL). Sono longevi e devono essere periodicamente ri-serializzati per avere una "storia" dei cambiamenti. Ma sono piuttosto costosi da serializzare e la maggior parte dei cambiamenti è minore.
Potrei serializzarli completamente ogni volta ed eseguire un binario diff sul flusso, ma questo suona molto intensivo della CPU. Una soluzione migliore sarebbe un'API che modifica le operazioni di scrittura sul modello per il protocollo delle modifiche, in modo che dopo l'iniziale "immagine" sia memorizzata, solo il protocollo deve essere memorizzato.
Ho trovato alcune domande che parlano di Apache Commons Beanutils per confrontare gli oggetti, ma che non è utile per le modifiche sul posto; Avrei bisogno di creare un clone completo del modello tra ogni "transazione commerciale".
Per reiterare, sto cercando un'API "in-memory", all'interno della stessa JVM, che non coinvolge alcuna applicazione server esterna. Le API che coinvolgono il codice nativo sono OK se sono disponibili su Win, Mac & Linux. L'API non deve essere correntemente impacchettata in modo indipendente; deve solo essere possibile estrarlo dal "progetto genitore" per formare un'API indipendente (la licenza del progetto genitore deve consentirlo).
I miei grafici di oggetti coinvolgeranno molti array di grandi dimensioni e pertanto devono essere supportati in modo efficiente.
Le modifiche non sono desiderate solo per il controllo, ma in modo che possano essere riprodotti o annullati. Più precisamente, con il grafico iniziale deserializzato e un elenco di modifiche, dovrei arrivare a un grafico finale identico. Inoltre, a partire dal grafico finale, dovrebbe essere possibile tornare al grafico iniziale applicando le modifiche al contrario. Questo utilizza esattamente la stessa funzionalità, ma richiede il protocollo di modifica per mantenere il vecchio valore in aggiunta al nuovo valore.
La licenza API deve essere compatibile con l'uso commerciale.
[EDIT] Finora non ho ricevuto risposta utile, e non mi sembra quello che voglio. Questo mi lascia con una sola opzione: fallo accadere. Inserirò un link qui come risposta quando ho un'implementazione funzionante, poiché questo è il prossimo passo nel mio progetto e non posso andare avanti senza di esso.
[EDIT] Ho trovato per caso questa domanda in qualche modo correlato: Is there a Java library that can "diff" two Objects?
Non completamente sicuro di ciò che si sta cercando. Ma i suoi suoni sono analoghi alla sovversione. Se gli oggetti sono stati serializzati su un file, che è stato controllato in SVN, la cronologia delle modifiche sarà lì. Non molto utile se stai cercando un accesso programmatico alle modifiche. Di che cosa hai bisogno? – scorpdaddy
LOL! Capisco cosa intendi, ma non si adatta affatto al mio caso d'uso. In primo luogo, dovrei essere tutti "in-memory", non basati su client-server, e in secondo luogo, tutti gli RCS sono intrinsecamente cattivi nei dati binari, che è quello che sto cercando di fare. Nessun XML o JSON coinvolti qui. Aggiornerò la domanda –
Non conosco alcuna API di questo tipo, ma forse potresti pensare negli approcci di ordine. Invece di provare l'approccio API trasparente, sembra che sia effettivamente un requisito per la tua applicazione. È possibile memorizzare il grafico iniziale una volta e quindi creare un albero con le versioni e i nuovi dati. –