为了账号安全,请及时绑定邮箱和手机立即绑定

无法将 zookeeper 对象转换为 json,反之亦然

无法将 zookeeper 对象转换为 json,反之亦然

呼啦一阵风 2022-07-14 09:53:35
大家好,我有一个简单的问题,我似乎无法使用 jersey 中的 GSON 库将 zookeeper 对象转换为 json ,反之亦然。我得到的错误是Exception in thread "main" java.lang.StackOverflowError    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381)    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376)    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381)    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376)它一直在持续很大。从我搜索的内容来看,这似乎是嵌套太深的对象和递归的问题。这是我尝试的简单 POCZooKeeper zoo;        try {            zoo = new ZooKeeper("localhost:2182",5000,null);            String obj=gson.toJson(zoo, ZooKeeper.class);        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }有人可以清楚地解释什么是实际问题,即使可以将 zookeeper 对象转换为 json 并将其使用(因为与之关联的所有线程)
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

ZooKeeper 是服务器而不是 DTO


也许你想用 DTO 配置做一个 json


我的提议


public static void main(String[] args) {

  ZooKeeper zoo;

  try {

    ZooKeeperConfDTO conf = new ZooKeeperConfDTO("localhost:2182", 5000, null);

    zoo = runZoo(conf);

    String json = new Gson().toJson(conf);

    System.out.println(json); //---->{"connectString":"localhost:2182","sessionTimeout":5000}

  } catch (Exception e) {

    e.printStackTrace();

  }

}


private static ZooKeeper runZoo(ZooKeeperConfDTO conf) throws IOException {

  return new ZooKeeper(conf.connectString, conf.sessionTimeout, conf.watcher);

}

并创建了班级


import org.apache.zookeeper.Watcher;


public class ZooKeeperConfDTO {

  public String connectString;

  public int sessionTimeout;

  public Watcher watcher;


  public ZooKeeperConfDTO(String connectString, int sessionTimeout, Watcher watcher) {

    this.connectString = connectString;

    this.sessionTimeout = sessionTimeout;

    this.watcher = watcher;

  }

}

版本 2:


为 ClientCnxn 创建你的 TypeAdapter


import java.io.IOException;

import org.apache.zookeeper.ClientCnxn;

import com.google.gson.TypeAdapter;

import com.google.gson.stream.JsonReader;

import com.google.gson.stream.JsonWriter;


public class ClientCnxnAdapter extends TypeAdapter<ClientCnxn> {

    @Override

    public void write(JsonWriter writer, ClientCnxn cnxn) throws IOException {

        writer.beginObject();

        writer.name("sessionId");

        writer.value(cnxn.getSessionId());

        writer.name("timeOut");

        writer.value(cnxn.getSessionTimeout());

        writer.endObject();

    }


    @Override

    public ClientCnxn read(JsonReader in) throws IOException {

        return null;

    }

}

并使用它


public static void main(String[] args) {

    ZooKeeper zoo;

    try {

        zoo = new ZooKeeper("localhost:2182", 5000, null);

        Gson gson = new GsonBuilder().registerTypeAdapter(ClientCnxn.class, new ClientCnxnAdapter()).create() ;

        String json = gson.toJson(zoo);

        System.out.println(json); //---->{"cnxn":{"sessionId":0,"timeOut":0},"watchManager":{"dataWatches":{},"existWatches":{},"childWatches":{}}}

    } catch (Exception e) {

        e.printStackTrace();

    }

}


查看完整回答
反对 回复 2022-07-14
  • 1 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信