【问题标题】:Collection serialization issues集合序列化问题
【发布时间】:2022-01-10 05:54:18
【问题描述】:

所以我的问题有点复杂。我有一个 User 类,我将它放入 ConcurrentHashMap。一个类对应一个用户。密钥是用户的 ID。

我正在使用 GSON 序列化这个 ConcurrentHashMap 并保存我的用户的数据。

在用户类内部,我有多个变量(整数、字符串等)和几个集合。 问题在于覆盖文件。我的 4 个 ArrayList 中有 2 个像往常一样序列化,但是当我添加另一个 ArrayList 或任何与此相关的集合时,该集合不会显示在文件中。但是,当我添加一个简单的变量(例如 String 或 Int)时,文件会更新并为每个用户附加这些值。创建新用户时,这些集合显示为什么都没有发生。我需要为现有用户添加这些集合。

我的问题是为什么不能在类中添加另一个 ArrayList,以及为什么它没有出现在文件中。

public class User {

private String nickname;
private String id;
private int coins;


  ...bunch of variables


private int bikes = 0;
private int scooters = 0;
private int goldIngots = 0;
private final ArrayList<Car> cars = new ArrayList<>(); //showing up
private final ArrayList<Hotel> hotels = new ArrayList<>(); //showing up
private final ArrayList<AwardType> awards = new ArrayList<>(); //not showing up   



...Constructor


...Getters And Setters

sample of UserClass

collections inside UserClass

how it should look

values are not appending

编辑

AwardType 是一个枚举。此包含 AwardType 的列表不会显示给现有用户,只会显示给新用户。

编辑 1

添加 Gson serializeNulls() 选项后,列表被添加到文件中,但为空。

"bikes": 0,
"scooters": 0,
"goldIngots": 0,
"cars": [],
"hotels": [],
"awards": null

【问题讨论】:

  • 请不要张贴您的代码图片;贴出实际代码。
  • @LouisWasserman 对不起,这是我在 StackOverflow 上的第一篇文章,我将在编辑中发布我的代码。
  • 你的User 类有无参数构造函数吗?当 Gson 找不到无参数构造函数时,它会创建一个实例而不调用任何构造函数或初始化程序块(因此也不分配默认值)。请尝试添加一个无参数构造函数(可以是private),看看是否有帮助。
  • @Marcono1234 我有 3 个参数给构造函数。这 3 个参数是昵称、id 和硬币。其余变量由我分配给默​​认值。例如 int bikes 变量默认等于 0。我有诸如 setBikes() 之类的方法来操作这些数字。
  • 我会尝试按照您的建议添加无参数构造函数。

标签: java serialization collections gson


【解决方案1】:

如 cmets 中所述,您需要向您的类添加一个无参数构造函数(有时也称为“默认构造函数”)。这个构造函数可能是private(所以你不会偶然调用它)。

Gson 需要此构造函数才能创建实例,然后在反序列化期间更新其字段值。其他带参数的构造函数不起作用,因为 Gson 无法确定哪个 JSON 属性与哪个构造函数参数匹配,并且假设参数的默认值(例如 0 和 null)可能在所有情况下都不正确。

如果没有检测到无参数构造函数,Gson 使用名为 sun.misc.Unsafe 的特定 JDK 类来创建实例,而不调用任何构造函数并且不执行任何初始化程序块(包括初始化字段)。这可能会导致您遇到的问题。此外,Unsafe 类可能并非在所有环境中都可用。因此,您应该避免依赖这种行为。

或者,您也可以为您的类创建一个InstanceCreator,但在大多数情况下,添加一个无参数的构造函数会更容易。

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 2019-03-20
    • 1970-01-01
    • 2010-12-16
    • 2023-03-03
    • 2020-01-21
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多