我使用Jackson测试了Scala案例类的序列化.
DeserializeTest.java
public static void main(String[] args) throws Exception { // being lazy to catch-all
final ObjectMapper mapper = new ObjectMapper();
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
mapper.writeValue(stream, p.Foo.personInstance());
System.out.println("result:" + stream.toString());
}
}
Foo.scala
object Foo {
case class Person(name: String, age: Int, hobbies: Option[String])
val personInstance = Person("foo", 555, Some("things"))
val PERSON_JSON = """ { "name": "Foo", "age": 555 } """
}
[error] Exception in thread "main" org.codehaus.jackson.map.JsonMappingException:
No serializer found for class p.Foo$Person and no properties discovered
to create BeanSerializer (to avoid exception,
disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )
我如何(de)-serial化Scala案例类?
解决方法:
Jackson期望你的类成为一个JavaBean,这意味着它希望类具有每个属性的getX()和/或setX().
选项1
您可以使用注释BeanProperty在Scala中创建JavaBean类.
例
case class Person(
@BeanProperty val name: String,
@BeanProperty val age: Int,
@BeanProperty val hobbies: Option[String]
)
在这种情况下,val将仅表示定义了一个吸气剂.如果需要用于反序列化的setter,则将属性定义为var.
选项2
虽然选项1可行,但如果你真的想使用Jackson,那么有一些包装器可以让它处理像FasterXML’s scala module这样的Scala类,这可能是一个更好的方法.我没有使用它,因为我刚刚使用内置的Json库来玩.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。