
auto-value-parcel TypeAdapter实战教程如何序列化Date等自定义类型【免费下载链接】auto-value-parcelAn Android Parcelable extension for Googles AutoValue.项目地址: https://gitcode.com/gh_mirrors/au/auto-value-parcel在 Android 开发中auto-value-parcel是 Google AutoValue 的 Parcelable 扩展库它能在编译期自动为AutoValue注解的类生成Parcelable实现让你彻底告别手写writeToParcel、CREATOR的繁琐代码。不过它默认只支持Parcel类内置的类型遇到Date、SparseArray这类自定义类型时就会报错。本教程将带你实战掌握auto-value-parcel TypeAdapter的使用方法轻松序列化Date等任意自定义类型。一、为什么自定义类型需要 TypeAdapterParcel类内置了序列化能力但支持范围有限。auto-value-parcel 默认能直接处理这些类型分类支持的类型基本类型int、long、float、double、boolean、byte、char、short引用类型String、CharSequence、Bundle、PersistableBundle、IBinder容器类型List、Map、数组、SparseArray、SparseBooleanArray特殊类型Parcelable、Serializable、Enum、Size、SizeF如果你在AutoValue类中声明一个Date属性编译时会提示 not a supported Parcelable type 错误。原因很简单Date既不是Parcelable也不是SerializableParcel 不知道如何读写它。TypeAdapter就是为解决这个问题而生的——它允许你为任意类型自定义序列化与反序列化逻辑。二、认识核心接口TypeAdapter 与 ParcelAdapterTypeAdapter 接口TypeAdapter 是一个泛型接口只需实现两个方法源码位于 TypeAdapter.javafromParcel(Parcel in)从 Parcel 中读取数据并还原对象toParcel(T value, Parcel dest)把对象写入 ParcelParcelAdapter 注解ParcelAdapter用于标记 AutoValue 中的某个属性指定它使用哪个 TypeAdapter 来序列化定义在 ParcelAdapter.java 中。用法极其简单只需要一行注解。三、实战手写 DateTypeAdapter 序列化 Date核心思路Date内部本质上是一个 long 类型的时间戳我们把它转换成long写入 Parcel读取时再还原成Date。代码如下public class DateTypeAdapter implements TypeAdapterDate { Override public Date fromParcel(Parcel in) { return new Date(in.readLong()); } Override public void toParcel(Date value, Parcel dest) { dest.writeLong(value.getTime()); } } 要点必须提供公开的无参构造函数编译期生成的代码会通过new DateTypeAdapter()实例化它读写顺序必须一致先writeLong后readLong否则数据会错乱value.getTime()返回毫秒时间戳new Date(long)反向还原双向对称掌握了这个套路序列化BigDecimal、LocalDateTime、自定义 Bean 等任何类型都只是翻译成 Parcel 内置类型的问题。四、用 ParcelAdapter 接入 AutoValue 类写完 TypeAdapter 后在 AutoValue 类的属性上加上注解即可AutoValue public abstract class Order implements Parcelable { ParcelAdapter(DateTypeAdapter.class) public abstract Date createTime(); public abstract String orderNo(); public static Order create(Date createTime, String orderNo) { return new AutoValue_Order(createTime, orderNo); } }编译后auto-value-parcel 会自动生成CREATOR静态字段与createFromParcel方法在writeToParcel中调用dateTypeAdapter.toParcel(createTime(), dest)在createFromParcel中调用dateTypeAdapter.fromParcel(in)整个过程零手写代码跨进程传参、startActivity传对象、Intent携带数据都变得轻松自然。✅五、快速配置添加 Gradle 依赖TypeAdapter 需要运行时组件因此在 build.gradle 中要添加两个依赖dependencies { annotationProcessor com.ryanharter.auto.value:auto-value-parcel:0.2.9 // TypeAdapter 支持必加否则编译期无法解析注解 implementation com.ryanharter.auto.value:auto-value-parcel-adapter:0.2.9 }想查看完整源码示例可以直接 clone 仓库git clone https://gitcode.com/gh_mirrors/au/auto-value-parcel其中的测试代码 AutoValueParcelExtensionTest.java 和示例 TypeAdapter 都是很好的学习参考。六、进阶技巧Nullable 与多字段复用支持 Nullable 属性TypeAdapter 对Nullable属性有内置支持序列化时会先写入一个 int 标记位区分 null 与非 null。你只需照常在属性上加注解Nullable ParcelAdapter(DateTypeAdapter.class) public abstract Date createTime();多个字段共用同一 TypeAdapter如果类中有多个Date字段直接对每个字段加注解即可。编译期会为每种 TypeAdapter 类型生成一个静态常量字段见 AutoValueParcelExtension.java 中的getTypeAdapters方法实例只会创建一次性能无忧。七、常见问题排查 问题原因解决方案编译报 not a supported Parcelable type属性类型不支持且未配置 TypeAdapter为属性添加ParcelAdapter运行时 ClassCastExceptionfromParcel 返回类型与属性类型不匹配检查 TypeAdapter 泛型声明读取到错误数据读写顺序或类型不对称核对write*与read*一一对应TypeAdapter 无法实例化缺少公开无参构造函数补上public无参构造八、总结通过本教程你已经掌握了auto-value-parcel TypeAdapter的核心玩法实现TypeAdapterT接口处理自定义类型的读写再用ParcelAdapter注解完成绑定最后配合 Gradle 依赖即可实现Date等任意类型的自动化序列化。这套机制让 AutoValue 的优雅与 Parcel 的高效兼得是 Android 开发者值得收藏的实用技能。想深入理解内部实现可以阅读 Parcelables.java 中readValue/writeValue的类型分发逻辑以及 TypeSimplifier.java 的类型判断工具你会发现整个设计既精巧又易于扩展。【免费下载链接】auto-value-parcelAn Android Parcelable extension for Googles AutoValue.项目地址: https://gitcode.com/gh_mirrors/au/auto-value-parcel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考