Java GSON未将新字段保存到文件

Java GSON未将新字段保存到文件,java,gson,Java,Gson,我正在向我的数据类添加新字段,它们不会保存到文件中。没有一个字段是瞬态的 我正在用GSON加载文件,然后重新保存以尝试保存新字段。我试着在构造函数中设置字段,只是在创建时设置它们。这两种方法都不起作用,我还尝试使用GSON以传统方式保存文件,但也不起作用。修改现有字段可以正常工作,并且可以正确保存,但不会创建新字段 private void loadUserData(播放器){ File userFile=新文件(userFolder+File.separator+player.getUniqu

我正在向我的数据类添加新字段,它们不会保存到文件中。没有一个字段是瞬态的

我正在用GSON加载文件,然后重新保存以尝试保存新字段。我试着在构造函数中设置字段,只是在创建时设置它们。这两种方法都不起作用,我还尝试使用GSON以传统方式保存文件,但也不起作用。修改现有字段可以正常工作,并且可以正确保存,但不会创建新字段

private void loadUserData(播放器){
File userFile=新文件(userFolder+File.separator+player.getUniqueId().toString()+“.json”);
试一试{
如果(!userFile.exists()){
用户用户=新用户(player.getUniqueId()、player.getName()、player.isOp()?“§8(§9Manager§8)§9:“§7”,”;
FileUtils.writeStringToFile(用户文件,新的GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(用户),StandardCharsets.utf8.name());
userCache.put(player.getUniqueId(),user);
}否则{
User User=new GsonBuilder().create().fromJson(新文件读取器(userFile),User.class);
user.save();
如果(!userCache.containsKey(player.getUniqueId())){
userCache.put(player.getUniqueId(),user);
}
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
public void save(){
File userFolder=新文件(Core.getInstance().getModuleManager().getModuleInstance(SMPModule.class).getDataFolder()+File.separator+“users”);
试一试{
FileUtils.writeStringToFile(新文件(userFolder+File.separator+uuid.toString()+“.json”),
新的GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(this),StandardCharsets.UTF_8.name();
}捕获(IOE异常){
e、 printStackTrace();
}
}
数据类:

package net.astreul.core.module.impl.SMP.user;
导入com.google.common.collect.list;
导入com.google.gson.GsonBuilder;
导入lombok.AccessLevel;
进口龙目织机;
导入net.astreul.core.core;
导入net.astreul.core.module.impl.SMP.SMPModule;
导入net.astreul.core.module.impl.SMP.cosmetic.cosmetic包;
导入net.astreul.core.util.Format;
导入org.apache.commons.io.FileUtils;
导入java.io.File;
导入java.io.IOException;
导入java.nio.charset.StandardCharset;
导入java.util.List;
导入java.util.UUID;
@塞特
公共类用户{
@Setter(AccessLevel.NONE)私有UUID UUID;
私有字符串昵称;
私有字符串前缀;
私有字符串后缀;
私人长登录;
私人拥有的化妆品;
私人拥有的标签;
私有字符串activeTag;
公共用户(UUID UUID、字符串昵称、字符串前缀、字符串后缀){
this.uuid=uuid;
this.昵称=昵称;
this.prefix=前缀;
this.suffix=后缀;
lastLogin=System.currentTimeMillis();
ownedCosmetics=Lists.newArrayList();
ownedTags=Lists.newArrayList();
this.activeTag=“”;
}
公共作废保存(){
File userFolder=新文件(Core.getInstance().getModuleManager().getModuleInstance(SMPModule.class).getDataFolder()+File.separator+“users”);
试一试{
FileUtils.writeStringToFile(新文件(userFolder+File.separator+uuid.toString()+“.json”),
新建GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create().toJson(this));
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共文件getFile(){
File userFolder=新文件(Core.getInstance().getModuleManager().getModuleInstance(SMPModule.class).getDataFolder()+File.separator+“users”);
返回新文件(userFolder+File.separator+uuid.toString()+“.json”);
}
公共字符串get昵称(){
返回格式。颜色(昵称);
}
公共字符串getPrefix(){
返回格式。颜色(前缀);
}
公共字符串getSuffix(){
返回格式。颜色(后缀);
}
公共长getLastLogin(){
返回上次登录;
}
公共包装(CosmeticPackage CosmeticPackage){
返回自己的化妆品。包含(化妆品包装);
}
公共列表getOwnedCosmetics(){
归还自己的化妆品;
}
公共列表getOwnedTags(){
归还自己的行李;
}
公共字符串getActiveTag(){
返回activeTag;
}
}

我希望它将新字段保存到文件中,但它根本没有保存任何内容。根本没有错误。

我认为这里的问题与gson如何创建实例有关

如果您查看gson的源代码,您会发现它试图使用以下三种方法之一创建对象实例。首先,它尝试实例创建者——知道如何创建对象的实体。您可以自己注册一个来创建用户检查

如果没有,它将检查默认构造函数,而您没有。默认构造函数是没有参数的构造函数

最后一步是尽最大努力创建对象,它使用Java的。顾名思义,这样做是不安全的,原因是它绕过了所有构造函数。在您的例子中,它将绕过您在构造函数中进行的任何初始化,并将不在json中的字段保留为null

如果不在外部更改字段,则保存用户对象后,新字段仍然为空,因此不会保存


要解决此问题,您可以提供一个实例创建者,或者从另一个方法初始化字段,或者以某种方式提供一个默认构造函数。

您可以展示一下您的数据类是如何定义的吗?是的,我编辑了这篇文章。新字段是
lastLogin
ownedCosmetics
ownedTags
activeTag
?基本上,所有在构造函数中初始化的字段?不,这些字段已经在用户中