java - 发送到套接字时 Kotlin java.io.NotSerializedException

标签 java sockets kotlin

这个问题已经针对 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,但它也不起作用。我想编写一个对象,而不仅仅是一个 StringInt

当我触发此函数时,收到“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/

相关文章:

kotlin - Kotlin 中辅助构造函数的语法

kotlin - 编译为 JavaScript 时如何测试 Kotlin 代码?

java - 运行时找不到Jar依赖

java - 如何在 Java 中将 Map<?,?> 转换为类型化 Map?

java - 当函数的代码作为方法参数传递时,如何测试它?

c++ - 非常简单的 C++ TCP 回显服务器

Java MySQL JDBC 驱动程序异常

sockets - 是否可以在 Unity3D 中的 NetworkManager (HLAPI) 和套接字服务器之间进行连接?

security - 使用 Jetty 进行安全套接字编程的任何已知资源?

android - 如何从 fragment 和 Activity 中传递和获取值(value)