Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中的Moshi vs Gson_Android_Gson_Deserialization_Moshi - Fatal编程技术网

android中的Moshi vs Gson

android中的Moshi vs Gson,android,gson,deserialization,moshi,Android,Gson,Deserialization,Moshi,我正在决定是否使用或Gson来序列化和反序列化模型数据 我一直不喜欢Gson的一点是,我认为它使用的反射在android上可能会很慢?摩希也使用反射吗 moshi vs Gson的一些优缺点是什么 我认为他们是相似的。以创建typeAdapter: class CardAdapter { @ToJson String toJson(Card card) { return card.rank + card.suit.name().substring(0, 1); } @Fro

我正在决定是否使用或Gson来序列化和反序列化模型数据

我一直不喜欢Gson的一点是,我认为它使用的反射在android上可能会很慢?摩希也使用反射吗

moshi vs Gson的一些优缺点是什么

我认为他们是相似的。以创建
typeAdapter:

class CardAdapter {
  @ToJson String toJson(Card card) {
    return card.rank + card.suit.name().substring(0, 1);
  }

  @FromJson Card fromJson(String card) {
    if (card.length() != 2) throw new JsonDataException("Unknown card: " + card);

    char rank = card.charAt(0);
    switch (card.charAt(1)) {
      case 'C': return new Card(rank, Suit.CLUBS);
      case 'D': return new Card(rank, Suit.DIAMONDS);
      case 'H': return new Card(rank, Suit.HEARTS);
      case 'S': return new Card(rank, Suit.SPADES);
      default: throw new JsonDataException("unknown suit: " + card);
    }
  }
}
要使用它,请像在gson中一样注册它:

Moshi moshi = new Moshi.Builder()
.add(new CardAdapter())
.build();

我想优点在于typeAdapter中使用的注释。我想知道如果我改用Moshi,是否会有任何性能提升

Moshi使用Okio优化了一些Gson没有的东西

  • 在这种情况下,Moshi不必分配字符串或进行哈希查找
  • Moshi将输入扫描为UTF-8字节序列,缓慢地转换为Java字符。例如,它从不需要将整数文本转换为字符
如果您已经在使用Okio streams,这些优化的好处尤其明显。Moshi的用户尤其受益

关于摩希起源的进一步讨论见我的帖子。

根据:

我为我在Gson上的工作感到自豪,但也对它的一些局限性感到失望。我想解决这些问题,但不是“Gson 3.0”,部分原因是我不再在谷歌工作。 Jake、Scott、Eric和我创建了Moshi来解决Gson的各种限制。以下是选择Moshi而非Gson的十个小理由:

  • 即将到来的Kotlin支持

  • 像@HexColor int这样的限定符允许对单个Java类型使用多个JSON表示

  • @ToJson和@FromJson使编写和测试自定义JSON适配器变得容易

  • failOnUnknown()允许拒绝意外的JSON数据

  • 可预见的例外情况。Moshi在IO问题上抛出IOException,在类型不匹配上抛出JsonDataException。格森到处都是

  • JsonReader.selectName()避免了常见情况下不必要的UTF-8解码和字符串分配

  • 您将发送一个较小的APK。Gson为227千磅,Moshi+Okio加起来为200千磅

  • Moshi不会将平台类型的实现细节泄漏到编码的JSON中。这让我害怕Gson:Gson.toJson(SimpleTimeZone.getTimeZone(“GMT”))

  • 默认情况下,Moshi不会进行奇怪的HTML转义。以Gson的默认编码“12&5=4”为例

  • 默认情况下未安装损坏的日期适配器


  • 如果您正在编写新代码,我强烈建议您从Moshi开始。如果您有一个使用Gson的现有项目,您应该升级,如果这样做简单且没有风险的话。否则就坚持使用Gson!我正在尽最大努力确保它保持兼容和可靠。

    从前面的链接中可以看到,使用moshi codegen将为模型类创建编译时适配器,这将消除运行时反射的使用

    模型

    app/build.gradle

    kapt "com.squareup.moshi:moshi-kotlin-codegen:$version_moshi"
    

    将生成带有验证的MyModelJsonAdapter类,以确保模型属性的可空性。

    是否使用reflection@j2emanue作为实施细则,,自定义类的默认JSONAdapter将设置带有反射的字段。@使用codegen可以避免j2emanue反射。您不认为moshi会更快吗?
    kapt "com.squareup.moshi:moshi-kotlin-codegen:$version_moshi"