在我的 TCP 服务器-客户端实现中,我的所有数据包都派生自实现 Serializable 的抽象基类。我将类转换为字节并通过套接字发送,接收器将这些字节反序列化并成功接收数据包。由于我缺乏关于序列化的知识,我不确定这是否可行,因为每个数据包类都有这样的警告:
可序列化类 CreateObjectPacket 未声明 long 类型的静态最终 serialVersionUID 字段
经过一番研究,我发现JVM使用这个UID来确保反序列化会成功(如果我没有错的话),所以为了摆脱这个警告,我让eclipse生成默认UID但是即使客户端和 Server 程序的 Packets 类完全相同,同一类的 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;
}