2016-10-10 3 views
1

Ich möchte eine ID für eine bestimmte Java - Klasse generieren, indem ich deren Feldnamen, Typen und alle anderen Komponenten der Klasse überprüfe, die bei der Serialisierung und Deserialisierung eine Rolle spielen, nicht unbedingt Java - Serialisierung wie Json etc .Wie generiere ich eine serialVersionUID-ähnliche ID für eine Java-Klasse zur Laufzeit?

Die ID-Generierung sollte wiederholbar und deterministisch sein, es sei denn, es gibt eine Änderung in einem Feldtyp oder einer anderen Komponente der Klasse. Ich denke, ich könnte rekursiv die Klasse durchqueren und so etwas erzeugen, aber ich wollte es nicht tun, wenn es keinen anderen Weg gibt.

Ich habe gelesen, dass Java eine komplexe Prozedur verwendet, um serialVersionUID zu bestimmen, wenn keine deklariert ist. Es betrachtet Klassenmitglieder, seine super Schnittstellen, etc. Es schien ähnlich, aber ich würde gerne auch IDs für nicht-serialisierbare Klassen generieren.

Mein Anwendungsfall ist, dass ich Java-Objekte in einem externen Datenspeicher speichere, und ich möchte diese Laufzeit-generierte ID in den Schlüssel integrieren, um nicht rückwärtskompatible Änderungen korrekt zu behandeln.

+0

Eclipse kann es automatisch zur Kompilierzeit generieren. Warum soll es zur Laufzeit erzeugt werden? – shmosel

+0

Der Anwendungsfall ist etwas anders. Es ist nicht ganz "serialVersionUID", die ich suche. Ich möchte etwas ähnliches und etwas, das nicht von Klassenautor (en) gepflegt wird. – phani

+2

Der Algorithmus zum Berechnen einer serialVersionUID wird unter http://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100 beschrieben. Sie müssen es natürlich nicht genau befolgen, aber es ist wichtig, dass die Felder und Methoden sortiert sind, da Reflektionsmethoden wie Class.getFields() nicht die Reihenfolge garantieren, in der die Member zurückgegeben werden. – VGR

Antwort

0

Sie können genau die serialVersionUID einer Klasse erhalten, ob das Feld vorhanden ist oder nicht, über ObjectStreamClass.forName(String).getSerialVersionUID().

+0

Danke für die Antwort. Ich möchte in der Lage sein, ein id/md5/sha auch für eine nicht-Serialisable Klasse zu erzeugen (einige benutzen möglicherweise nur json-basierte Serialisierung). Habe gerade die Frage aktualisiert, um diese Anforderung hervorzuheben. – phani

Verwandte Themen