我有一个下面的密封类:
sealed class ViewModel {
data class Loaded(val value : String) : ViewModel()
object Loading : ViewModel()
}
我如何序列化/重新序列化ViewModel类的示例,比如说从JSON格式序列化/重新序列化?
我试过使用Genson序列化器/并行化器库-它可以处理Kotlin数据类,也可以支持多态类型(例如。使用某些元数据来指定具体类型)。
但是,库在Kotlinobject
类型上失败,因为这些类型是没有公共构造函数的单例。我想我可以写一个自定义的Genson转换器来处理它,但也许有一个更简单的方法来做到这一点?
5条答案
按热度按时间w8ntj3qf1#
关于创建自定义序列化程序,您可能是对的。
我尝试使用Jackson库和Kotlin序列化和反序列化你的类。
以下是Jackson的Maven依赖项:
您可以使用此库将密封类序列化为JSON,而无需额外的自定义序列化器,但反序列化需要自定义反序列化器。
下面是我用来序列化和反序列化密封类的玩具代码:
如果你运行这段代码,这是输出:
wljmcqd82#
我最近也遇到了类似的问题(虽然用的是Jackson,而不是Genson。)
假设我有以下内容:
然后将
JsonCreator
函数添加到密封类中:现在,您可以在json属性中使用
ChildOne
或ChildTwo
作为key
进行格式化。a7qyws3x3#
我最终实现了一个自定义转换器加上一个工厂,以正确地插入到Genson。
它使用Genson的元数据约定将对象表示为:
转换器假定设置了useClassMetadata标志,因此序列化只需要标记一个空对象。对于示例化,它从元数据中解析类名,加载类名并获得objectInstance。
为了确保这个转换器只应用于实际的对象,我使用一个工厂来注册它,它告诉Genson何时使用它,何时回退到默认实现。
工厂可用于通过builder配置Genson:
代码可能会更好的链接转换器功能,但我没有时间检查出来。
lg40wkob4#
不需要
@JsonCreator
和sealdSubClass
。Jackson在其jackson-module-kotlin
中提供了这种支持,只需要一个注解@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
:上面的例子是从它的主repo README复制的:https://github.com/FasterXML/jackson-module-kotlin
6tqwzwtp5#
我遇到了一个类似的问题,花了一天的时间来解决它,@X.Y https://stackoverflow.com/a/71315804/18916677的一个答案帮助了我,但它有点不完整
要解决你面临的问题,你需要两件事,
1.你的Jackson
objectMapper
需要一个配置为支持Singleton对象的KotlinModule,下面是一个代码片段瓦尔objectMapper:ObjectMapper = JsonMapper.builder().build()objectMapper.registerModule(KotlinModule.Builder().enable(KotlinFeature.SingletonSupport).build())
1.第二件事是由上面的答案-> https://stackoverflow.com/a/71315804/18916677提供的,这是
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
注解通过执行上述两个步骤,Jackson使用类名序列化对象,并使用类名将其序列化,同时保持单例行为不变
如果您只使用第二步解决问题,您可能会看到问题已经解决,但是每次执行示例化时,您最终都会得到不同的示例
!!编码快乐!!