1

私の TCP サーバー/クライアントの実装では、すべてのパケットは、Serializable を実装する抽象基本クラスから派生しています。クラスをバイトに変換してソケットを介して送信すると、受信者はこれらのバイトを取得してデシリアライズし、パケットを正常に受信します。シリアル化に関する知識が不足しているため、すべてのパケット クラスに次のような警告があるため、これが機能するかどうかはわかりません。

シリアル化可能なクラス CreateObjectPacket は、long 型の static final serialVersionUID フィールドを宣言しません

少し調査した結果、JVM がこの UID を使用してデシリアライゼーションが成功することを確認していることがわかったので (私が間違っていなければ)、この警告を取り除くために、Eclipse にデフォルトの UID を生成させますが、クライアントとサーバープログラムはパケットに関してまったく同じクラスを持っていますが、UID は同じクラスで異なります。逆シリアル化時に問題が発生しますか、またはこれらの UID を 1,2,3... のように手動で設定する必要がありますか? ところで、着信バイトを超抽象クラス Packets にデシリアライズしていますが、これも問題ですか、それとも派生 Packets に自由にキャストする必要がありますか?

編集: 最後に、私の抽象 Packets クラスには、逆シリアル化のために fromByteArray と呼ばれる静的メソッドがあります。

public static Packets fromByteArray(byte[] arr) {

    ByteArrayInputStream bis = new ByteArrayInputStream(arr);
    ObjectInput in = null;
    try {
        in = new ObjectInputStream(bis);
        Packets o = (Packets) in.readObject();
        return o;
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            bis.close();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    return null;
}
4

1 に答える 1

1

少し調査した結果、JVM がこの UID を使用してデシリアライゼーションが成功することを確認しました。

具体的には、シリアル化 (非) 化されるオブジェクトのバージョンを識別するために使用されます。UID の自動割り当てを許可すると、シリアル化されるオブジェクトの内部構造がたまたま変更された場合に、開発環境 (IDE) が新しい UID を割り当てることになっています。これにより、JVM は、あるバージョンのオブジェクトを同じクラス名を持つ別のバージョンのオブジェクトにデシリアライズしようとしているかどうかを認識できます。

バージョン ID を自分で割り当て、オブジェクトの内部構造 (メンバー フィールドなど) を変更する場合は、バージョン ID も変更する必要があります。これは、クラス定義と、ディスク/ネットワークからデシリアライズしようとしているオブジェクトとの間にバージョンの不一致がある場合に、JVM がキャッチできるようにするためです。

再コメント: http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html 5.6 シリアル化に影響する型の変更 - 互換性がある変更と互換性がない変更

UID の目的は、オブジェクトのシリアライズされた構造が変更され、オブジェクトのどの部分も確実にデシリアライズできないかどうかを JVM に示すことです。上で書いたように、シリアル化されるオブジェクトの構造に互換性のない変更が加えられた場合にのみ変更されるはずです。 オブジェクトがクライアントとサーバーの両方で同一である場合、クライアント コードとサーバー コードの間で UID が一致しないと、オブジェクトを逆シリアル化する際に問題が発生する可能性があります。 UID を定義しないことでこれを回避できますが、オブジェクトの実装が将来変更された場合の結果に注意してください。

于 2013-05-07T21:36:36.317 に答える