当前位置: 首页 > 知识库问答 >
问题:

Scala对象的序列化

穆毅然
2023-03-14

我正在遵循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:在java.io.ObjectOutputStream.WriteObject0(ObjectOutputStream.java:1184)在java.io.ObjectOutputStream.java:1184)在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)在java.html" target="_blank">io.ObjectOutputStream.WriteRialData(ObjectOutputStream.WriteRialData(ObjectOutputStream.1509)在8)在java.io.ObjectOutputStream.DefaultWriteFields(ObjectOutputStream.java:1548)在java.io.ObjectOutputStream.WriteRialData(ObjectOutputStream.java:1509)在java.io.ObjectOutputStream.WriteOrdinaryObject(ObjectOutputStream.java:1432)在java.io.ObjectOutputStream.WriteObject0(ObjectOutputStream.java:1178)在java.io.ObjectOutputStream.WriteObject(ObjectOutputStream.WriteObject SerializationSpec.Scala:20)

我已尝试显式设置类型

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

但还是没有运气。

如何将scala对象正确序列化为java ObjectOutputStream?

共有1个答案

通正平
2023-03-14

序列化内部类在Java和Scala中都是一个雷区,但如果在您的实际代码中没有对testrecord中的basicserializationspec成员的引用,那么您应该可以通过向内部类定义添加一个final修饰符来实现此操作:

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

在实际代码中,您不太可能测试在测试类中定义的类,但在测试内部类时可能会遇到类似的情况。

 类似资料:
  • 然后是班级选拔: 教材: 因此,我主要创建新用户并将其序列化: 一切都很完美,但如果我这样做: 然后我想序列化对象用户,程序崩溃了。我得到的结果是: JAVA木卫一。NotSerializableException:在java上。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1183)。木卫一。ObjectOu

  • 我试图使用SimpleXML序列化HealthCase类的对象。我能够正确地序列化所有内容,除了测试对象的ArrayList和每个测试对象拥有的图像对象的ArrayList。所有类的每个字段都有适当的访问器和突变器方法,但是当我尝试序列化时,会抛出各种xml复合写入错误,并且不会写入相关的XML文件。 HealthCase类(不包括方法): 测试类别(不包括方法): 图像类(不包括方法): 我应该

  • 问题内容: 我定义了一些案例类,如下所示: 我也有一个用Scalatra定义的端点: 我想要这个JSON对象: 反序列化为的适当实例。我正在努力弄清楚如何为其编写自定义反序列化器并将其注册到JSON4S。 问题答案: 您需要编写如下的序列化器: 序列化器 : 现在,您将不得不将此序列化器添加为默认格式。 希望这能解决您的问题。

  • 当我运行Spark Scala程序时,有一个“Task not serializable”异常 Spark RDD是不可串行化类型(java类) 调用的函数来自不可序列化的类(java类,再次) 我的代码是这样的 我注意到我可以用 但对于RDD中的对象类,我仍然会遇到这个例外。我会以另一种方式,也会以另一种方式,也就是第二部分,因为我不想创建大量PredicateClass的对象。 你能帮我吗?我

  • 我正在尝试过滤scala中对象列表的列表属性。例如: 用java定义的类 我的过滤器函数返回字符串列表而不是结果列表 UPDATE我想取回listOf中的所有结果,其中每个结果的名称属性被过滤。

  • 主要内容:示例我们将一个Java对象序列化为一个Json文件,然后读取该Json文件以获取对象。 在这个例子中,创建一个类。 然后将对象列化后存储在文件中,该文件将具有对象的json表示形式。 示例 在中创建一个名为的Java类文件,参考以下代码 - 执行上面示例代码,得到以下结果 -