Wenn Sie serialVersionUID (1L) verwenden, anstatt serialVersionUID (3567653491060394677L) zu generieren, sagen Sie etwas.
Sie sagen, dass Sie zu 100% sicher sind, dass kein System, das diese Klasse jemals berühren wird, eine inkompatible serialisierte Version dieser Klasse mit der Versionsnummer 1 hat.
Wenn Sie sich eine Entschuldigung dafür vorstellen können, dass der Verlauf der serialisierten Version unbekannt ist, ist dies möglicherweise schwer mit Sicherheit zu sagen. Zu Lebzeiten wird eine erfolgreiche Klasse von vielen Menschen gepflegt, in vielen Projekten gelebt und in vielen Systemen untergebracht.
Darüber können Sie sich quälen. Oder Sie können im Lotto spielen und hoffen zu verlieren. Wenn Sie die Version generieren, besteht eine geringe Wahrscheinlichkeit, dass etwas schief geht. Wenn Sie davon ausgehen, dass "Hey, ich wette, noch hat niemand 1 verwendet", sind Ihre Chancen größer als winzig. Gerade weil wir alle 0 und 1 für cool halten, haben Sie höhere Chancen, sie zu treffen.
- -
Wenn Sie serialVersionUID (3567653491060394677L) generieren, anstatt serialVersionUID (1L) zu verwenden, sagen Sie etwas.
Sie sagen, dass die Leute im Laufe der Geschichte dieser Klasse möglicherweise andere Versionsnummern manuell erstellt oder generiert haben, und es ist Ihnen egal, weil Longs große Zahlen ausflippen.
In beiden Fällen gehen Sie ein Risiko ein, es sei denn, Sie kennen den Verlauf der Versionsnummern, die bei der Serialisierung der Klasse im gesamten Universum, in dem sie existiert oder jemals existieren wird, verwendet werden, genau. Wenn Sie die Zeit haben, 100% sicher zu stellen, dass 1 AOK ist, machen Sie es. Wenn das zu viel Arbeit ist, generieren Sie die Nummer blind. Es ist wahrscheinlicher, dass Sie im Lotto gewinnen, als dass dies schief geht. Wenn ja, lass es mich wissen und ich kaufe dir ein Bier.
Bei all dem Gerede über das Lotto spielen habe ich vielleicht den Eindruck erweckt, dass serialVersionUID zufällig generiert wird. In der Tat, solange der Zahlenbereich gleichmäßig über jeden möglichen Wert eines Long verteilt ist, wäre das in Ordnung. Es wird jedoch tatsächlich so gemacht:
http://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100
Der einzige Unterschied, den Sie dabei bekommen, ist, dass Sie keine Zufallsquelle benötigen. Sie verwenden die Änderungen in der Klasse selbst, um das Ergebnis zu ändern. Nach dem Pigeonhole-Prinzip besteht jedoch immer noch die Möglichkeit, dass ein Fehler auftritt und eine Kollision auftritt. Es ist einfach unglaublich unwahrscheinlich. Also viel Glück, ein Bier aus mir herauszuholen.
Selbst wenn die Klasse immer nur in einem System und einer Codebasis leben wird, bedeutet der Gedanke, dass das Erhöhen der Zahl von Hand keine Kollisionswahrscheinlichkeit bietet, nur, dass Sie Menschen nicht verstehen. :) :)