私の 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;
}