我正在使用Genson将Android应用程序中的json序列化+反序列化为多态对象。JSON来自各种来源,但我不能保证@class元数据将成为JSON中的第一行。遍历Genson代码并编写测试用例,看来@class元数据必须是字典中的第一项。
有人有运气解决这个限制吗?现在该切换到其他内容了吗?
public class Message {
Payload payload;
// getters & setters
}
public abstract class Payload {
//
}
public class Notification1 extends Payload {
String text;
// getters & setters
}
public class Notification2 extends Payload {
String otherText
// getters & setters
}
String correctOrder = {"@class":"Message","payload":{"@class":"Notification1","text":"Text"}}
String modifiedOrder = {"@class":"Message","payload":{"text":"Text", "@class":"Notification1"}}
Genson g = Genson.Builder()
.addAlias("Notification1", Notification1.class)
.addAlias("Notification2", Notification2.class)
.useRuntimeType(true)
.useClassMetadata(true)
.useMetadata(true)
.useFields(false)
.useIndentation(false)
.create();
g.deserialize(correctOrder, Message.class) // This works
g.deserialize(modifiedOrder, Message.class) // This barfs with the error: com.owlike.genson.JsonBindingException: Could not deserialize to type class com.ol.communication.messages.Message
确实,顺序很重要。这是有意选择的,请参阅用户指南中的备注。
如果我们允许在json对象中的任何位置使用@class属性,则必须首先将所有json对象(及其子属性obj / arr等)反序列化为中间数据结构,然后再反序列化为正确的类型。确实,这将导致额外的内存开销和较低的速度,但具有更大的灵活性。
一种解决方案是标记多态类(构建器中的注释/配置),Genson会为其搜索/产生流中的@class属性。这将仅对流中的多态对象具有此开销。
目前尚未实施,但是我提出了一个问题。它将在将来的版本中发布。
在技术方面之外,在处理多个外部API时,我不认为您应该具有多态逻辑(或任何其他奇特的东西)。我的意思是,这种功能是特定于库的,因此,如果您在两端都不使用相同的工具,则可能会遇到麻烦。通常,人们都有一个用于与API进行通信并将数据映射到您的模型的层。如果您在两端都不拥有代码,那么从长远来看,我认为这将是一个很好的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句