2016-10-10 12 views
1

私は、フィールド名、型、および直列化と逆シリアル化の際に役割を果たすクラスの他のすべてのコンポーネントを調べることで、特定のJavaクラスのIdを生成したいと思います。実行時にJavaクラスのserialVersionUIDのようなIDを生成するにはどうすればいいですか?

IDの生成は、フィールドタイプやクラスの他のコンポーネントに変更がない限り、反復可能であり、決定論的でなければなりません。私は再帰的にクラスを横断してそのようなものを生み出すことができると思うが、他の方法がない限り、それをしたくない。

宣言されていない場合、JavaはserialVersionUIDを決定する複雑な手順を適用します。それはクラスメンバ、そのスーパーインタフェースなどを考慮しています。それは似ていたようですが、の非同期化クラスのIDも生成したいと思います。

私はJavaオブジェクトを外部データストアに保存していますが、このランタイム生成IDをキーに組み込んで、非後方互換性のある変更を正常に処理したいと考えています。

+0

Eclipseはコンパイル時に自動的に生成することができます。実行時に生成する必要があるのはなぜですか? – shmosel

+0

ユースケースは若干異なります。それは私が探している 'serialVersionUID'ではありません。私は似たようなものと、クラスの作者によって維持されていないものが好きです。 – phani

+2

serialVersionUIDを計算するアルゴリズムについては、http://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100で説明しています。 Class.getFields()のようなリフレクションメソッドはメンバーが返される順序を保証しないので、フィールドやメソッドをソートすることは重要です。 – VGR

答えて

0

ObjectStreamClass.forName(String).getSerialVersionUID()でフィールドが存在するかどうかにかかわらず、任意のクラスの正確にserialVersionUIDを取得できます。

+0

お返事ありがとうございます。私は非Serializableクラスのid/md5/shaも生成できるようにしたいと考えています(いくつかはjsonベースの直列化を使用しているかもしれません)。その要件を顕著にするために質問を更新しました。 – phani

関連する問題