所以我的问题有点复杂。我有一个User类,我把它放在ConcurrentHashMap〈String,User〉中。一个类对应一个用户。关键字是用户的ID。
我使用GSON序列化这个ConcurrentHashMap,并保存用户的数据。
在用户类中,我有多个变量。(int、String等)和一些集合。问题是覆盖文件。我的4个ArrayList中有2个像往常一样序列化,但是当我添加另一个ArrayList或任何集合时,该集合不会显示在文件中。然而,当我添加一个简单的变量(如String或Int)时,这个文件更新并为每个用户追加这些值。2当新用户被创建时,这些集合显示为没有发生任何事情。3我需要为已经存在的用户添加这些集合。
我的问题是,为什么不能在类中添加另一个数组列表,为什么它没有出现在文件中。
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
1条答案
按热度按时间vyu0f0g11#
正如注解中提到的,你需要在类中添加一个无参数构造函数(有时也称为“默认构造函数”),这个构造函数可能是
private
(这样你就不会意外调用它了)。Gson需要这个构造函数来创建一个示例,然后在反序列化过程中更新它的字段值。其他带参数的构造函数不起作用,因为Gson不能确定哪个JSON属性匹配哪个构造函数参数,并且假设参数的默认值(例如0和
null
)在所有情况下都可能不正确。如果没有检测到无参数构造函数,Gson将使用一个名为
sun.misc.Unsafe
的特定JDK类创建一个示例,而不调用任何构造函数,也不执行任何初始化程序块(包括初始化字段)。这可能会导致您遇到的问题。此外,Unsafe
类可能并不是在所有环境中都可用。因此,您应该避免依赖此行为。或者,您也可以为您的类创建一个
InstanceCreator
,但在大多数情况下,添加一个无参数构造函数会更容易。