这个问题已经针对 Java 提出了,但是,当我尝试通过网络发送对象时,我遇到了一个奇怪的问题。该对象的类如下
class Packet(override val type: PacketType) : Serializable, Packet {
override var payload: Any? = null;
companion object {
private const val serialVersionUID = 578515438738407941L
}
}
正如你所看到的,它已经实现了 Serialized 接口(interface),并且包含了我的教授告诉我这是必需的。
我正在尝试使用此函数通过网络发送该对象
fun sendToServer(payload: Packet, sender: Client, receiver: Server): Unit {
try {
val requestSocket = Socket(InetAddress.getByName(receiver.ip), receiver.port)
val out: ObjectOutputStream
out = ObjectOutputStream(requestSocket.getOutputStream())
println("Sending $payload to $receiver.")
out.writeUnshared(payload)
out.flush()
} catch (err: Exception) {
System.err.println("$sender Tried to connect to -> $receiver But an error occurred.")
err.printStackTrace()
}
}
错误发生在第 22 行,因此 writeUnshared
似乎是问题所在。我尝试过WriteObject
,但它也不起作用。我想编写一个对象,而不仅仅是一个 String
或 Int
。
当我触发此函数时,收到“NotSerializedException”错误。我对此很困惑,它正在处理我的一个旧项目。如果您需要更多解释,请在下面发表评论,我很乐意更新这个问题。
最佳答案
我能够解决我自己的问题,我希望也许有人会发现这很有用。问题隐藏在有效负载字段内。
我使用以下代码创建了一个数据包对象
val factory = PacketFactory()
val packet: Packet = factory.makePacket(PacketType.REGISTRATION)
packet.payload = this
sendToServer(packet, this, where)
问题似乎出在 packet.payload = this
部分,我将一个不可序列化的对象封装在可序列化的对象中。如果这样做,显然您最终会得到一个不可序列化的对象,因此您无法通过网络发送它。
修复是以下代码
val factory = PacketFactory()
val packet: Packet = factory.makePacket(PacketType.REGISTRATION)
packet.payload = "BLABLABLA"
sendToServer(packet, this, where)
“blablabla”部分是可序列化的,所以每个人都很高兴! (包括JVM)
希望您在阅读本文后有所收获,祝您有美好的一天!
关于java - 发送到套接字时 Kotlin java.io.NotSerializedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60962397/