【发布时间】:2018-06-11 12:58:07
【问题描述】:
当您有一个带有大量变量(布尔值、整数、字符串)的大型 POJO 并且您想使用新的工作管理器来开始工作时。然后,您创建一个数据文件,该文件将添加到一次性工作请求对象中。
构建此数据文件的最佳做法是什么? (写 100 行代码只是说在构建器上为每个变量设置 int 感觉是错误的。)
回答
我最终分解了我的可包裹对象,因为我认为这是最好的实现。我不想使用 gson lib,因为它会为我的对象添加另一层序列化。
Data.Builder builder = new Data.Builder();
builder.putBoolean(KEY_BOOL_1, stateObject.bool1);
builder.putBoolean(KEY_BOOL_2, stateObject.bool2);
builder.putBoolean(KEY_BOOL_3, stateObject.bool3);
builder.putInt(KEY_INT_1, stateObject.int1);
builder.putInt(KEY_INT_2, stateObject.int2);
builder.putString(KEY_STRING_1, stateObject.string1);
return builder.build();
更新
正如@CommonsWare 指出的那样,我的问题的部分答案是:
不支持 Parcelable 的原因是数据被持久化了。
不确定 Data not support parcelable 的详细答案是什么?
- This answer 解释了它:
Data 是一个轻量级容器,它是一个简单的键值映射 并且只能保存原始和字符串的值及其 字符串版本。它实际上是用于轻量级的中间传输 数据。它不应该用于并且不能保持 可序列化或 Parcelable 对象。
请注意,序列化时数据的大小限制为 10KB。
【问题讨论】:
-
恕我直言,您只在
Data中添加工作独有的内容。其他所有内容都属于作为工作的一部分加载的其他模型对象,这些模型对象与 Room、Realm、Retrofit 甚至不以 R 开头的东西一起存储。:-)Parcelable的原因不是支持的是数据被持久化。据我所知,键是独一无二的,所以你的两个putString()调用应该被一个putStringArray()调用替换。 -
@CommonsWare 我想我的问题的答案是你的_不支持 Parcelable 的原因是数据是持久的。 _ 谢谢您的帮助。另请注意,这两个字符串只是一个示例。我现在更新我的帖子以反映新信息
-
那么通过工作发送可序列化额外内容的解决方案是什么?
-
@noob-Sci-Bot 如果您不需要担心 parcelable,那么 gson 可能是最好的解决方案。
-
我们知道为什么不支持
Parcelable,但仅仅解决整个问题是一个很大的倒退。现在每个开发人员都必须构建自己的序列化方法,而 JSON 虽然是最容易编码的,但性能却比 parcelable 差得多。
标签: android