集合序列化问题



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

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

在用户类内部,我有多个变量(int、Strings等(和一些Collections。覆盖文件时出现问题。我的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

UserClass 示例

UserClass 内的集合

应该是什么样子

值没有附加

编辑

AwardType是一个枚举。此列表中包含的AwardType不适用于现有用户,仅适用于新用户。

编辑1

在添加Gson serializeNulls((选项后,列表将被添加到文件中,但作为一个null。

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

如注释中所述,您需要向类中添加一个无参数构造函数(有时也称为"默认构造函数"(。这个构造函数可能是private(所以您不会意外地调用它(。

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

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

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

最新更新