Kotlin java .io.NotSerializableException при отправке в сокет - PullRequest
0 голосов
/ 01 апреля 2020

этот вопрос уже задают для Java, однако я сталкиваюсь со странной проблемой, когда пытаюсь отправить объект по сети. Класс объекта следующий:

class Packet(override val type: PacketType) : Serializable, Packet {

    override var payload: Any? = null;

    companion object {
        private const val serialVersionUID = 578515438738407941L
    }

}

Как видите, он уже реализует интерфейс Serializable и содержит serialVersionUID, который, как мне сказали мои профессора, необходим.

I я пытаюсь отправить этот объект по сети с помощью этой функции

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.

Когда я запускаю эту функцию, я получаю ошибку "NotSerializableException". Я так смущен этим, он работал над моим старым проектом. Если вам нужно больше объяснений, , пожалуйста, , прокомментируйте ниже, и я буду рад обновить этот вопрос.

1 Ответ

0 голосов
/ 01 апреля 2020

Я смог решить свою собственную проблему, и я надеюсь, что, возможно, кто-то найдет это полезным. Проблема была скрыта в поле payload .

Я создал пакет объект со следующим кодом

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)

Я надеюсь, что вы узнали что-то после прочтения этого, прекрасного дня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...