Genson中类元数据的顺序很重要-是否有解决方法?

麦可

我正在使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

BeamSQL 中的“LIKE”是否有解决方法?

来自分类Dev

是否有解决方法可以通过泛型类使用静态方法?

来自分类Dev

是否有解决方法可以通过泛型类使用静态方法?

来自分类Dev

是否有解决方法,使类运算符适用于内置类型

来自分类Dev

在多个龟类中使用>运算符是否有解决方法?

来自分类Dev

是否有解决方法,使类运算符适用于内置类型

来自分类Dev

SuperCSV中的可选ParseDate SuperCsvCellProcessorException是否有解决方法?

来自分类Dev

来自其他域的AJAX响应中的Cookie不被接受-是否有解决方法

来自分类Dev

解释数组中的字符串“ </ script>”,是否有解决方法?

来自分类Dev

递归PowerShell函数中的调用深度溢出,是否有解决方法?

来自分类Dev

IE8中data:uri的32KB限制是否有解决方法?

来自分类Dev

是否有解决方法来为c ++中的短裤定义用户定义的文字?

来自分类Dev

对于geom_violin中的此闪避失败,是否有解决方法?

来自分类Dev

SuperCSV中的可选ParseDate SuperCsvCellProcessorException是否有解决方法?

来自分类Dev

解释数组中的字符串“ </ script>”,是否有解决方法?

来自分类Dev

VBA 中 ODBCConnection.CommandText 字符串的最大长度是否有解决方法?

来自分类Dev

与基于pouchdb的系统客户端进行数据同步:“已删除”标志是否有解决方法?

来自分类Dev

Vertica一次限制一个数据库是否有解决方法?

来自分类Dev

生成UUID的默认值中断了Django 1.7中的迁移,是否有解决方法?

来自分类Dev

用户名未保存在 openconnect VPN 连接对话框中的错误是否有解决方法

来自分类Dev

npm publish -f是否有解决方法

来自分类Dev

强制使用mapply是否有解决方法

来自分类Dev

我尝试的Hive插入是否有解决方法

来自分类Dev

Debian文件补全破坏$ _是否有解决方法?

来自分类Dev

QDMLOPNF 128 限制是否有解决方法?

来自分类Dev

java8中是否有增加int的方法/解决方法

来自分类Dev

是否有针对列表中的 *args 或 Python 中的 for 循环的解决方法?

来自分类Dev

在Excel 2003中是否没有XlFileFormat.xlOpenXMLWorkbook支持的解决方法?

来自分类Dev

我的代码是否有简单的解决方法,以使mysql Update语句在csharp中工作?

Related 相关文章

  1. 1

    BeamSQL 中的“LIKE”是否有解决方法?

  2. 2

    是否有解决方法可以通过泛型类使用静态方法?

  3. 3

    是否有解决方法可以通过泛型类使用静态方法?

  4. 4

    是否有解决方法,使类运算符适用于内置类型

  5. 5

    在多个龟类中使用>运算符是否有解决方法?

  6. 6

    是否有解决方法,使类运算符适用于内置类型

  7. 7

    SuperCSV中的可选ParseDate SuperCsvCellProcessorException是否有解决方法?

  8. 8

    来自其他域的AJAX响应中的Cookie不被接受-是否有解决方法

  9. 9

    解释数组中的字符串“ </ script>”,是否有解决方法?

  10. 10

    递归PowerShell函数中的调用深度溢出,是否有解决方法?

  11. 11

    IE8中data:uri的32KB限制是否有解决方法?

  12. 12

    是否有解决方法来为c ++中的短裤定义用户定义的文字?

  13. 13

    对于geom_violin中的此闪避失败,是否有解决方法?

  14. 14

    SuperCSV中的可选ParseDate SuperCsvCellProcessorException是否有解决方法?

  15. 15

    解释数组中的字符串“ </ script>”,是否有解决方法?

  16. 16

    VBA 中 ODBCConnection.CommandText 字符串的最大长度是否有解决方法?

  17. 17

    与基于pouchdb的系统客户端进行数据同步:“已删除”标志是否有解决方法?

  18. 18

    Vertica一次限制一个数据库是否有解决方法?

  19. 19

    生成UUID的默认值中断了Django 1.7中的迁移,是否有解决方法?

  20. 20

    用户名未保存在 openconnect VPN 连接对话框中的错误是否有解决方法

  21. 21

    npm publish -f是否有解决方法

  22. 22

    强制使用mapply是否有解决方法

  23. 23

    我尝试的Hive插入是否有解决方法

  24. 24

    Debian文件补全破坏$ _是否有解决方法?

  25. 25

    QDMLOPNF 128 限制是否有解决方法?

  26. 26

    java8中是否有增加int的方法/解决方法

  27. 27

    是否有针对列表中的 *args 或 Python 中的 for 循环的解决方法?

  28. 28

    在Excel 2003中是否没有XlFileFormat.xlOpenXMLWorkbook支持的解决方法?

  29. 29

    我的代码是否有简单的解决方法,以使mysql Update语句在csharp中工作?

热门标签

归档