Сериализация объектов Scala - PullRequest
0 голосов
/ 04 марта 2019

Я следую базовому примеру сериализации объекта scala .Однако при выполнении приведенного ниже модульного теста

package mytest

import java.io.{ByteArrayOutputStream, ObjectOutputStream}

import org.scalatest.{Matchers, WordSpec}

class BasicSerializationSpec extends WordSpec with Matchers {

  @SerialVersionUID(123L)
  class TestRecord(var content: String) extends Serializable {
    override def toString = s"TestRecord($content)"
  }

  "A TestRecord" should {
    "be serializable" in {
      val oo = new ObjectOutputStream(new ByteArrayOutputStream())

      val tr = new TestRecord("42")

      oo.writeObject(tr)

      oo.close
    }
  }
}

я получаю исключение:

org.scalatest.Assertions $ AssertionsHelper java.io.NotSerializableException: at java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1184) в java.io.ObjectOutputStream.defaultWriteFields (ObjectOutputStream.java:1548) в java.io.ObjectOutputStream.writeSerialData (ObjectOutputStream.javaOputOutOutOutOjectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOjectOject.jectOject.jectOject.jectOjectOject.jectOject.utOject.jectOject.jectOject.jectOject.utOject.jectOut.jectOject.jectOject.jectOut.jectOut.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOject.jectOutjava: 1432) в java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1178) в java.io.ObjectOutputStream.defaultWriteFields (ObjectOutputStream.java:1548) в java.io.ObjectOutputStream.wavaOutputStream.wavaOutputDreamStwatautDDjava.io.ObjectOutputStream.writeOrdinaryObject (ObjectOutputStream.java:1432) в java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1178) в java.io.ObjectOutputStream.writeObject (ObjectavautS3).anonfun $ новый $ 2 (BasicSerializationSpec.scala: 20)

Я пытался явно указать тип

val tr : java.io.Serializable = new TestRecord("42")

Но все же не повезло.

Как правильно сделатьсериализовать объект scala в java ObjectOutputStream ?

Это не дублирование других ответов стека , потому что я явно расширяю Serializable с помощью моего объявления класса.

Заранее благодарим вас за внимание и ответ.

1 Ответ

0 голосов
/ 04 марта 2019

Сериализация внутренних классов является минным полем как в Java, так и в Scala, но при условии, что в вашем реальном коде нет ссылок на члены BasicSerializationSpec в TestRecord, вы сможете выполнить эту работу, добавив *Модификатор 1003 * для определения внутреннего класса:

final class TestRecord(var content: String) extends Serializable {

В реальном коде вы вряд ли будете тестировать классы, которые вы определяете внутри своего тестового класса, но вы можете столкнуться с подобными ситуациями при тестировании внутренних классов.

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