当前位置: 首页 > news >正文

android 使用GSON 序列化对象出现字段被优化问题解决方案


一、问题描述

有以下结构:

public class NativeParam<T> {private T data;public NativeParam(T data) {this.data = data;}public T getData() {return data;}public void setData(T data) {this.data = data;}
};

NativeParam<String> data = "1.0.1";
String result = gson.toJson(new NativeParam<>("1.0.1"));
log.i(TAG,"GET_APP_VERSION_INFO-result:" + result);
});

输出信息如下:

GET_APP_VERSION_INFO-result:{"a":"1.0.1"}

如上“data” 字段被序列化成了“a” 。


二、问题解决过程及原因分析


开始以为字段被优化成了"a"、"b"等,这可能是由于 Gson 库默认启用了字段混淆(Field Naming Policy)功能,将字段名压缩为较短的形式。


尝试使用以下两种方法进行解决:


1、禁用字段混淆

通过设置 Gson 的字段命名策略来禁用字段混淆。可以使用 GsonBuilder 类来创建 Gson 对象,并调用 setFieldNamingPolicy 方法来设置字段命名策略。以下是禁用字段混淆的示例代码:

Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create();String jsonString = gson.toJson(yourObject);

通过将 FieldNamingPolicy.IDENTITY 作为字段命名策略,字段名将与原始对象中的字段名保持一致,不会被压缩。


2、使用 @SerializedName 注解

如果只想针对特定字段禁用字段混淆,可以在这些字段上使用 @SerializedName 注解,并为注解的值指定原始字段名。


如下:

class YourClass {@SerializedName("originalFieldName")private String fieldName;// ...
}Gson gson = new Gson();
String jsonString = gson.toJson(yourObject);

通过在字段上使用 @SerializedName 注解,可以指定该字段在序列化为 JSON 字符串时应使用的原始字段名,而不受字段混淆的影响。


然而以上两种方法都没能解决。

突然想到 被优化成了"a"、“b” 有点像打包时开启了 代码混淆,于是果断加上gson 的混淆规则,果然问题得以解决。


三、最终解决方案

加上gson 的混淆规则 ,注意: com.test.demo.NativeParam 需要替换为自己的mode 结构。


#gson  start
# custom 不能混淆的要加上
# Application classes that will be serialized/deserialized over Gson
-keep class com.test.demo.NativeParam {  *; }#gson start
-keep class com.google.gson.** {*;}
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.reflect.TypeToken { *; }
-keep class * extends com.google.gson.reflect.TypeToken
-keep class com.google.** {<fields>;<methods>;
}
-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve();
}
-dontwarn com.google.gson.**
#gson  end

测试输出结果如下:

GET_APP_VERSION_INFO-result:{"data":"1.0.1"}

http://www.lryc.cn/news/265283.html

相关文章:

  • 进入不了Bios?进入Bios的方法都在这了,肯定能进!
  • 手把手教你基于 FastGPT 搭建个人知识库
  • gitee 怎么添加SSH密钥
  • 万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码
  • macOS 开发 - MASShortcut
  • 【大数据面试】Flink面试题附答案
  • 语音识别之百度语音试用和OpenAiGPT开源Whisper使用
  • Rust报错:the msvc targets depend on the msvc linker but `link.exe` was not found
  • 2312llvm,04后端上
  • springboot学习笔记(五)
  • 文件上传——后端
  • 虾皮开通:如何在虾皮上开通跨境电商店铺
  • C语言—每日选择题—Day60
  • 【3D生成与重建】SSDNeRF:单阶段Diffusion NeRF的三维生成和重建
  • 计算机网络:应用层
  • 现代雷达车载应用——第3章 MIMO雷达技术 3.2节 汽车MIMO雷达波形正交策略
  • Unresolved plugin: ‘org.apache.maven.plugins‘解决报错
  • 阿里云林立翔:基于阿里云 GPU 的 AIGC 小规模训练优化方案
  • 从0开始学Git指令
  • B039-SpringMVC基础
  • Tomcat报404问题解决方案大全(包括tomcat可以正常运行但是报404)
  • debian10安装配置vim+gtags
  • vue跳转方式
  • 基于ssm+jsp学生综合测评管理系统源码和论文
  • 网络基础篇【网线的制作,OSI七层模型,集线器和交换机的介绍,路由器的介绍与设置】
  • CSRF检测工具(XSRF检测工具)使用说明
  • docker 部署kafka
  • Android 架构 - 组件化
  • 数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结
  • 【Java】【SQL】DATE_FORMAT函数详解