Json4s:不支持方法体中定义的类

     2023-04-15     83

关键词:

【中文标题】Json4s:不支持方法体中定义的类【英文标题】:Json4s: Classes defined in method bodies are not supported 【发布时间】:2016-02-24 01:46:39 【问题描述】:

我有一个Seq

case class IntPane(
                    override val duration: FiniteDuration,
                    override val values: mutable.Map[String, Int],
                    override val default: Int)
  extends BasePane[Int](duration, values, default)

我可以通过调用writes() 来序列化它们,使用这个格式化程序:

implicit val formats: Formats = DefaultFormats +
    FieldSerializer[scala.collection.mutable.Map[String, Int]]() +

但是,我希望忽略一些字段,所以我添加了这些行:

implicit val formats: Formats = DefaultFormats +
FieldSerializer[scala.collection.mutable.Map[String, Int]]() +
FieldSerializer[IntPane](ignore("duration")) +
FieldSerializer[IntPane](ignore("default"))

现在,序列化失败并出现这个神秘的异常:

org.json4s.package$MappingException:不支持在方法体中定义的类。 在 org.json4s.reflect.package$.fail(package.scala:93) 在 org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3$$anonfun$15.apply(Reflector.scala:139) 在 org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3$$anonfun$15.apply(Reflector.scala:135) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 在 scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) 在 scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47) 在 scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 在 scala.collection.AbstractTraversable.map(Traversable.scala:105) 在 org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3.apply(Reflector.scala:135)

【问题讨论】:

注意:Json4s 和 default implementations of Scala maps 都容易受到 DoS/DoW 攻击! 【参考方案1】:

我已经快速尝试了一下,以下似乎可行:

val intPaneFieldSerializer = FieldSerializer[IntPane](ignore("duration") orElse ignore("default"))

implicit val formats: Formats = DefaultFormats + FieldSerializer[scala.collection.mutable.Map[String, Int]]() + intPaneFieldSerializer

【讨论】:

【参考方案2】:

不支持在方法体中定义的类。

错误信息表明案例类IntPane是在方法内部定义的。

  def myMethod() 
    case class IntPane(...)
  

如果将 IntPane 案例类定义移到方法之外,则可以解决问题。

  case class IntPane(...)

  def myMethod() 
    ...
  

【讨论】:

#2019-2020-4《java程序设计》第六周总结(代码片段)

...:成员变量和方法,类还可以有一种成员:内部类。(2)java支持在一个类中声明另一个类,这样的类称为内部类,而包含内部类的类称为内部类的外部类。声明内部类如同在类中声明方法和成员变量一样,一个类把内部类看作是自... 查看详情

20175227张雪莹2018-2019-2《java程序设计》第五周学习总结

...static(可以省略public、static、final)接口体中所有的抽象方法访问权限都是public(可以省略publicabstract)用类实现方法时,方法的访问权限一定要明显用public修饰,且该类体中可直接使用接口中关键字抽象类可以重写接口中方法... 查看详情

es6中的类

前面的话  大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5。由于类似的库层出不穷,最终还是在ECMAScript6中引入了类的... 查看详情

es6中的类

前面的话  大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5。由于类似的库层出不穷,最终还是在ECMAScript6中引入了类的... 查看详情

为啥我的类不继承其基类中定义的方法?

】为啥我的类不继承其基类中定义的方法?【英文标题】:Whyisn\'tmyclassinheritingamethoddefinedinitsbaseclass?为什么我的类不继承其基类中定义的方法?【发布时间】:2021-01-0107:06:58【问题描述】:我正在研究Goodrich等人的数据结构和算... 查看详情

Flutter 扩展方法不起作用,它说“未定义的类”和“需要扩展方法语言功能”

】Flutter扩展方法不起作用,它说“未定义的类”和“需要扩展方法语言功能”【英文标题】:Flutterextension-methodsnotworking,itsays"undefinedclass"and"requirestheextension-methodslanguagefeature"【发布时间】:2020-08-2922:53:53【问题描... 查看详情

学号201753292018-2019-3《java程序设计》第六周学习总结(代码片段)

...类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。内部类仅供它的外嵌类使用,... 查看详情

一个java内部类有几个分类?

...有用static修饰且定义在在外部类类体中。常规内部类中的方法可以直接使用外部类的实例变量和实例方法。在常规内部类中可以直接用内部类创建对象。静态内部类:与类的其他成员相似,可以用static修饰内部类,这样的类称为... 查看详情

20165306第五周学习任务(代码片段)

...部类外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。内部类仅供它的外嵌类使用,... 查看详情

编程基础

1、c++与java的相似点以及不同点?(不全) Java支持类,但不支持结构体;所有的类继承自Object类;所有的函数及方法必须定义在类中;  Java支持接口(interface),可以创建出一种只包含方法申名与常量的接口。c++不支... 查看详情

抽象类和接口的区别

...,它仅仅承诺了能够调用的方法。  7、接口可以用于支持回调,而继承并不具备这个特点。  8、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然也可以声明为虚的。  9、如果抽象... 查看详情

可以把宏定义放在结构体中吗

当然不能够,结构体中只能定义一些变量,你见过structinti;#define......example;?呵呵貌似是不允许的参考技术A宏定义可以放在程序的任何地方,作用范围是从定义到文件结束或遇到#undef,放在结构体内与结构体外是一样的,写在结... 查看详情

如何覆盖模块中的类常量和方法?

】如何覆盖模块中的类常量和方法?【英文标题】:Howtooverrideclassconstantsandmethodsfromamodule?【发布时间】:2022-01-2403:31:33【问题描述】:我正在尝试创建一个模块来为某些类定义一些方法和常量。这意味着可以在模块和包含该模... 查看详情

接口和抽象类的区别

...范,抽象类是一个不完全的类,着重于族的概念。4.接口支持回调,抽象类不能实现回调,因为继承不支持。5.接口只包含方法,属性,索引器,事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性,字段,包... 查看详情

20165212任胤第五周学习总结

...章知识点内部类:内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员声明内部类如同在类中声明方法或变量一样,一个类把内部类看作是自己的成员外嵌类的成员变量在内部... 查看详情

java里的interface接口类怎么用

  Java不支持多重继承,即一个类只能有一个父类  为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口  接口是抽象方法和常量值定义的集合,是一种特殊的抽象类接口中只包含常量和方法的定义,没有变... 查看详情

scala_方法和函数(代码片段)

方法的定义deffunctionName([参数列表]):[returntype]=functionbodyreturn[]如果没有=和包裹的方法体,那么该方法被隐式申明为抽象(abstract)方法,包含它的类就是抽象类。abstractclassTestdefhi(x:Int):Intdefhe(x:Int)x+1当输入相同类型的参数个数无法... 查看详情

python的类和对象入门

...,它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作:属性引用和实例化。属性引用的语法就是一般的标准语法:obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用,前者会返回一条数据,而后者会返回一个方... 查看详情