为什么我需要使用transient关键字来避免使用Gson和SocketChannel属性的java.lang.StackOverflower错误?
我用Gson来维持一个数据库的用户。为什么我需要使用transient for socketCh属性来避免StackOverflower错误为什么我需要使用transient关键字来避免使用Gson和SocketChannel属性的java.lang.StackOverflower错误?,java,json,database,gson,transient,Java,Json,Database,Gson,Transient,我用Gson来维持一个数据库的用户。为什么我需要使用transient for socketCh属性来避免StackOverflower错误 public class User { String username; String password; ArrayList<String> friends; transient SocketChannel socketCh = null; ... } 公共类用户{ 字符串用户名; 字符串密码; Ar
public class User {
String username;
String password;
ArrayList<String> friends;
transient SocketChannel socketCh = null;
...
}
公共类用户{
字符串用户名;
字符串密码;
ArrayList朋友;
瞬态SocketChannel socketCh=null;
...
}
当执行“fileWriter.write(gson.toJson(usersDB))”并且socketCh不是暂时的时,就出现了堆栈溢出问题
static void updateOrCreateDBFile() {
File file = new File(nameJsonDBFile);
Gson gson = new Gson();
try {
if(file.createNewFile()) {
usersDB = new HashMap<String, User>();
System.out.println(name3d + ": Creating the database json file");
}
FileWriter fileWriter = new FileWriter(file);
System.out.println(name3d+": usersDB "+usersDB);
fileWriter.write(gson.toJson(usersDB));
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
static void updateOrCreateDBFile(){
文件文件=新文件(名称JSONDBFILE);
Gson Gson=新的Gson();
试一试{
if(file.createNewFile()){
usersDB=newhashmap();
System.out.println(name3d+“:创建数据库json文件”);
}
FileWriter FileWriter=新的FileWriter(文件);
System.out.println(name3d+“:usersDB”+usersDB);
write(gson.toJson(usersDB));
fileWriter.close();
}捕获(IOE异常){
e、 printStackTrace();
返回;
}
}
似乎SocketChannel
有一个循环引用,这是Gson不支持的。我希望可以将SocketChannel
移动到用户实体之外。无论如何,您不能序列化SocketChannel
,但它肯定不应该在用户
内部,这是一个糟糕的设计。我使用socketCh的原因有:1)在不同的上下文中注销,我可以简单地传递一个用户作为参数,我可以将用户设置为脱机(socketChannel==null),并将其从HashMap socketToUserDB中删除,socketToUserDB由联机用户弹出,用于从使用ServerChannel.accept()打开的客户端通道获取用户。2) 因为我不确定我是否总能从上下文中获得连接通道(我确实可以,但我现在觉得离开它更安全)