为什么我需要使用transient关键字来避免使用Gson和SocketChannel属性的java.lang.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

我用Gson来维持一个数据库的用户。为什么我需要使用transient for socketCh属性来避免StackOverflower错误

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) 因为我不确定我是否总能从上下文中获得连接通道(我确实可以,但我现在觉得离开它更安全)