問題タブ [serialversionuid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - serialVersionUID を使用するか、警告を抑制しますか?
たとえば、HttpServlet を拡張するクラスを作成したいですか? クラスに serialVersionUID が必要であるとコンパイラが警告します。このオブジェクトが決してシリアル化されないことがわかっている場合、それらの警告を抑制するためにオブジェクトを定義するか、注釈を追加する必要がありますか?
あなたは何をしますか、なぜですか?
java - 指定された serialVersionUID を持つ jar のクラスを検索します
java.io.InvalidClassException を取得すると、必要な serialVersionUID と取得した serialVersionUID が返されます。何十もの jar のどれが間違った serialVersionUID を使用しているかを簡単に確認する方法はありますか?
更新: 私たちの意図はすべてを同時に更新することですが、ビルドとデプロイのプロセスで問題をデバッグしようとしています。
java - serialVersionUID とは何ですか? なぜそれを使用する必要があるのですか?
serialVersionUID
aが欠落 している場合、Eclipse は警告を発行します。
シリアライズ可能なクラス Foo は、long 型の static final serialVersionUID フィールドを宣言していません
それは何でserialVersionUID
、なぜ重要なのですか?serialVersionUID
欠落が問題を引き起こす例を示してください。
java - 明示的な serialVersionUID は有害と見なされますか?
新しいクラスに serialVersionUID を明示的に指定するのは良くないように思えます。レイアウトを変更する必要がある場合に変更しない場合と、変更する必要がない場合に変更する場合の 2 つのケースを考えてみましょう。
変更すべきときに変更されないのは、ほとんど明示的である場合に限られます。この場合、非常に微妙で見つけにくいバグが発生します。特に開発中は、クラスのレイアウトが頻繁に変更されます。ただし、明示的に指定されていない場合は変更され、逆シリアル化が大声で中断されます。ほとんどの場合、リポジトリをパージすることで解決されます。
変更すべきではない場合に変更するのは、暗黙的である場合に限られます。これは、クラス レイアウトが変更されたまれなケースですが、古いシリアル化された BLOB から逆シリアル化したい場合です。これは QA ( 5.2 から 5.2.1 へのアップグレード後の奇妙なエラー、添付のスタック トレースを参照)中にキャッチされる可能性があり、明示的な値を設定することで簡単に修正できます。
コメント?
java - Java-バイナリシリアル化オブジェクトのserialVersionUIDを変更する
数か月前、java.io.Serializableオブジェクトをファイルにシリアル化しました。ここで内容を読み取る必要がありますが、それ以降、serialVersionUIDが変更され、「クラス互換性がありません」というエラーが発生します。どのデータメンバーも変更されていないことを知っているので、唯一の障壁はserialVersionUIDチェックです。
チェックを無効にする方法、またはバイナリファイルのserialVersionUIDを変更する方法はありますか?
明確化
この質問は、ソースを編集できないことを前提としています。.classファイルをハックしたり、シリアル化されたオブジェクトファイルをハックしたりする方法はありますか(16進エディターを使用して、特定のオフセットで値を変更します)?
java - オブジェクトのserialVersionUIDが異なる場合に、データベースに永続化されたオブジェクトをデシリアライズする方法
私のクライアントにはOracleデータベースがあり、オブジェクトはobjOutStream.writeObjectを介してblobフィールドとして永続化されていました.オブジェクトは現在、serialVersionUID
(オブジェクトに変更がなくても、おそらく異なるjvmバージョンです)別のものを持っています.例外がスローされます:
彼らは最初から固定値を割り当てていなかったserialVersionUID
ので、何かが変わったので例外がスローされました。現在、彼らはデータを失いたくありません。そのためには、オブジェクトを読み取り、デシリアライズし、XMLEncoder を介して再度永続化して、現在の「クラスの互換性がない」エラーなどの将来のエラーを回避するのが最善だと思います。
どうやらserialVersionUID
そのオブジェクトの永続化には2つの異なる値があるので、データを読みたいのですが、1つの値で試して、失敗した場合は他の値で試してください。そうするために、をserialVersionUID
使用してクラスの を
変更しようとしましたASM API . 値を変更することはできましたが、問題はクラスの変更をアクティブにする方法です。そのため、シリアル化解除されたときにobjInpStr.readObject()
、変更したバージョンのクラスを特定の .xml で取得しますserializedVersionUID
。実際の環境をシミュレートするテスト クラスを作成しました。オブジェクトを取得します (別のserialVersionUID
問題を持つオブジェクトをプロパティとして持っています)。オブジェクト名はReservation
プロパティです
CommissionResult
。
ファイルを保存した後に変更し、新しいファイルを使用してファイルを読み取ったため、テストはjava.io.InvalidClassException
「ローカルクラスの互換性がありません」で失敗するはずですが、失敗しないため、変更されたバージョンのクラスが使用されていないことを意味します。serialVersionUID
ObjectInputStream.readObject
Reservation
何か案は?前もって感謝します。
!!!!!!!!!!!!!アップデート:
わかりました、resultClassDescriptor を再定義してストリーム serialVersionUID をオーバーライドすることは可能ですが、前に言ったように、クラスの 2 つのバージョンが永続化されているように見える奇妙なことが起こります。 value は、ローカル クラスに値を指定しない場合に生成されるものです。
-serialVersionUID の値を指定しない場合、デフォルト値 (8452040881660460728L) が使用されますが、他の値を持つオブジェクトをシリアル化解除することはできません。プロパティが他のプロパティであるというエラーがスローされます。タイプ。
-値 -5239021592691549158L を指定した場合、その値で永続化されたクラスは正常に逆シリアル化されますが、他の型は同じエラーになります。
これはエラートレースです:
潜在的に致命的な逆シリアル化操作。java.io.InvalidClassException: シリアライズされたクラス バージョンの不一致を上書きしています: ローカル serialVersionUID = -5239021592691549158 ストリーム serialVersionUID = 8452040881660460728 com.posadas.ic.rules.common.commisionRules.CommissionResult のインスタンス内のタイプ java.lang.String の CommissionResult.statusCode
このエラーがスローされたとき、クラスの値は -5239021592691549158 でした。値を 8452040881660460728 に変更すると、クラスは正常に逆シリアル化されます。間違ったクラスにキャストしようとするエラーはなぜですか?
ありがとう
java - 単純な1Lではなく長いserialVersionUIDを生成するのはなぜですか?
クラスがEclipseでSerializableを実装する場合、2つのオプションがあります。デフォルトを追加するserialVersionUID(1L)
か、生成されserialVersionUID(3567653491060394677L)
ます。最初の方がかっこいいと思いますが、2番目のオプションを使用している人を何度も見ました。生成する理由はありますlong serialVersionUID
か?
java - 抽象クラスは serialVersionUID を持つべきか
Java では、クラスが Serializable を実装しているが抽象的である場合、serialVersionUID long を宣言する必要がありますか、それともサブクラスはそれのみを必要としますか?
この場合、型の目的は RMI 呼び出しで使用されるため、すべてのサブクラスがシリアライゼーションを処理するという意図があります。
java - メソッドを追加すると、クラスで Java が計算した serialVersionUid が変更されますか?
このようなクラスがある場合:
別のメソッドを追加すると (フィールドを追加しないと)、計算された serialVersionUID は変更されますか?
たとえば、次のメソッドを追加します。
または、これを理解するための優れたツールはありますか?
java - シリアル化されたオブジェクトのserialVersionUIDを検索する
serialVersionUID
シリアル化されたJavaオブジェクトの生成を判別する方法はありますか?
問題は、を明示的に指定せずにオブジェクトをシリアル化したことserialVersionUID
です。現在、逆シリアル化プロセスはクラスの非互換性について不平を言っています。ただし、互換性がなくなるような方法でクラスを変更しませんでした。serialVersionUID
したがって、オブジェクトデータに格納されているクラスでを指定するだけで十分だと思います。これを行うにはserialVersionUID
、シリアル化されたデータからを読み取る必要があります。