Domanda

Abbiamo un sistema di produzione che utilizza un sacco di serializzazione. Che fondamentalmente fare è archiviare un oggetto chiamato ProcessData nel database jBPM come array di byte. Così questo viene serializzato.

Si consideri il seguente oggetto.

public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }
}

Ora diciamo che abbiamo questo oggetto memorizzato nel database JBPM come array di byte e che stiamo usando questo in produzione.

Ora poi vogliamo aggiornare questo oggetto ProcessData con un nuovo data

public class ProcessData implements Serializable {
  private static final long serialVersionUID = -4859440951531011062L;

  public void getX() {
    //not important
  }

  public void getY() {
    //not important
  }
}

Ora il problema è quando i carichi jBPM l'oggetto ProcessData old memorizzato, otteniamo un'eccezione Caused by: java.io.InvalidClassException: my.package.ProcessData; local class incompatible: stream classdesc serialVersionUID = 6651422488035743444, local class serialVersionUID = -7966721901330644987

Ora la mia domanda è, come possiamo risolvere questo problema? Come possiamo fare leggere l'oggetto serializzato e una sorta di trasformarla in questa nuova classe. E 'anche possibile? Ricorda che non abbiamo un controllo limitato sul biblioteca JBPM.

È stato utile?

Soluzione

Sembra che non si utilizza il codice di esempio in ogni caso, dal momento che nel tuo esempio si sta definendo il serialVersionUID (questo è un bene) ed è la stessa prima e dopo, ma nel tuo errore, i di UID sono diversi. Per questo si verifichi, l'UID o non è definito (così generata), oppure è stata cambiata tra le versioni. Il caso sarebbe generato anche causare un cambiamento tra le versioni in quanto le firme di classe sono diversi.

In entrambi i casi, questo sarebbe il comportamento previsto.

Sembra che il codice vero e proprio viene eseguito in realtà non abbinare il vostro esempio. Per caricare il vecchio codice, si dovrà impostare l'UID nella nuova versione in modo che corrisponda quello che esiste già nelle classi persistenti (6651422488035743444L). Inoltre, è più semplice gestire l'UID se si utilizzano semplici numeri, come le versioni 1,2,3.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top