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

如何使案例类/对象在scala中不可序列化?注释/特征/帮助器有效

柴霖
2023-03-14

在scala中,我想禁用许多case类的可序列化特性,因为我希望这类对象永远不会被序列化,并在分布式计算框架(特别是ApacheSpark)中发送到远程计算机,当包含它的任何闭包被序列化时,任何这样做的实现都应该触发显式运行时异常。

我尝试过@transient null check,它在反序列化时触发运行时异常(不是我想要的),错误信息非常模糊。有什么方法可以改善这一点吗?

非常感谢你的建议!

共有1个答案

莫承运
2023-03-14

可以实现并混合使用禁用序列化的特性:

trait NotSerializable extends Serializable {
  private def writeObject(out: java.io.ObjectOutputStream): Unit = throw new NotSerializableException()
  private def readObject(in: java.io.ObjectInputStream): Unit = throw new NotSerializableException()
  private def readObjectNoData(): Unit = throw new NotSerializableException()
}

case class Test(foo: String) extends NotSerializable

尝试序列化将引发异常

new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(Test("test"))
|-> java.io.NotSerializableException: A$A39$A$A39

但是,您实际上需要case类的什么特性?最简单的解决方案可能是不使用case类和对象。

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

  • 问题内容: 给定以下类层次结构,我希望根据类层次结构中使用的上下文,对Foo进行不同的序列化。 我希望序列化FooContainer时biz属性不显示在fooB中。因此,输出将类似于以下内容。 我本打算使用JsonView,但是必须将其应用于类的所有实例的映射器层,并且这取决于上下文。 在Jackson用户的邮件列表中,Tatu提供了最简单的解决方案(在2.0中可用),我现在可能最终会使用它。将奖

  • 我正在遵循scala对象序列化的基本示例。但是,当运行下面的单元测试时 我有个例外: org.scalatest.assertions$assertionshelper java.io.NotSerializableException:在java.io.ObjectOutputStream.WriteObject0(ObjectOutputStream.java:1184)在java.io.Obj

  • 问题内容: 我想知道是否有一种方法可以指定在类方法之前调用方法。我知道这样的事情应该是可能的,因为JUnit具有before(),所以我想做的事情是相似的。 这是我想做的一个具体例子 基本上我想要一个注释在foo()之前告诉编译器或jvm调用init() 问题答案: 如果有的话,您可以使用此接口的实例和方法的内部包装,您可以自由检查方法是否带注释,并根据该方法执行一些操作: 或者,您可以尝试使用A

  • 问题内容: 如何序列化未实现Serializable的对象?我不能将其标记为Serializable,因为该类来自第3方库。 问题答案: 您不能序列化未实现的类,但可以将其包装在可以实现的类中。为此,您应该在包装器类上实现和,以便可以以自定义方式序列化其对象。 首先,使您的非序列化字段。 在中,首先调用流以存储所有非瞬态字段,然后调用其他方法来序列化不可序列化对象的各个属性。 在中,首先调用流以读

  • 我有一个简单的JSON语句,类型非常适合需要。像这样 或 我使用POJO类映射这个json字符串和pojo类代码是给bleow 我正在使用jaxb和jakson。我正在实现webservice来处理json语句,所以我使用bean类来映射json。但是当我使用映射这个json时,它会给出以下异常 org.codehaus.jackson.map.JsonMappingExcture:名称为"mbo