【问题标题】:gson and referencesgson 和参考资料
【发布时间】:2012-10-20 21:16:14
【问题描述】:

我在 Android 中有一个小应用程序,它必须通过套接字与服务器通信。问题是:我可以使用Gson来序列化对象的引用吗?

我举个例子: 如果我有这样的 B 类:

public class B{
    int n;

    public B(int n){
        this.n=n;
    }

    public int getN() {
        return n;
    }

    public void setN(int n) {
        this.n = n;
    }

    public B() {
        super();
    }
}

还有一个像这样的A类

public class A{
    B b1;
    B b2;
    B b3;

    public B getB1() {
        return b1;
    }

    public void setB1(B b1) {
        this.b1 = b1;
    }

    public B getB2() {
        return b2;
    }

    public void setB2(B b2) {
        this.b2 = b2;
    }

    public B getB3() {
        return b3;
    }

    public void setB3(B b3) {
        this.b3 = b3;
    }

    public A(B b1, B b2, B b3) {
        super();
        this.b1 = b1;
        this.b2 = b2;
        this.b3 = b3;
    }

    public A() {
        super();
    }
}

比我说的

B b1 = new B(1); B b2 = new B(2)
A a = new A(b1,b1,b2);

如果我序列化(使用(new Gson()).toJson(a,A.class) 我获得的对象

{"b1":{"n":1},"b2":{"n":1},"b3":{"n":2}}

但我更希望有这个链接

{istance1:{b1: {"b1":istance2,"b2":istance2,"b3":istance2},istance2: {"n":1},istance3:{"n":2}}

你能帮帮我吗?我读了很多页,但没有找到任何东西!

【问题讨论】:

  • 我也花了很多时间从另一个角度实现这一点,但找不到任何满意的答案。见here。似乎没有对此的本机支持。但是,如果您的服务器可以帮助您识别 json 中的对象类型,那么可能会有一些定制的解决方案。
  • 感谢您的回答。我还写了服务器,所以我可以构造序列化器和反序列化器

标签: java android gson


【解决方案1】:

看看 GraphAdapterBuilder,它可以做到这一点。您需要将该文件复制到您的应用程序中,因为它不包含在 Gson 中。

Roshambo rock = new Roshambo("ROCK");
Roshambo scissors = new Roshambo("SCISSORS");
Roshambo paper = new Roshambo("PAPER");
rock.beats = scissors;
scissors.beats = paper;
paper.beats = rock;

GsonBuilder gsonBuilder = new GsonBuilder();
new GraphAdapterBuilder()
    .addType(Roshambo.class)
    .registerOn(gsonBuilder);
Gson gson = gsonBuilder.create();

assertEquals("{'0x1':{'name':'ROCK','beats':'0x2'}," +
    "'0x2':{'name':'SCISSORS','beats':'0x3'}," +
    "'0x3':{'name':'PAPER','beats':'0x1'}}",
    gson.toJson(rock).replace('\"', '\''));

https://code.google.com/p/google-gson/source/browse/trunk/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java

【讨论】:

  • 杰西这正是我所需要的!非常感谢!!!我没有找到它,因为它没有记录,但它非常有用!
【解决方案2】:

JSON 是为数据交换而设计的标准。这样,为了“标准化”通信,它需要遵循一些规则。

如果你想使用 GSon 来序列化数据,你不能改变它的序列化方式。这就是模式

如果你真的想按照自己的方式生成序列化数据,我认为你还需要为它生成序列化器/反序列化器!

祝你好运

【讨论】:

  • 感谢 Renato,现在我将检查如何编写序列化器和反序列化器。我以为有jet一个系统,但是如果它不存在我可以写它
  • 您真的需要数据才能拥有这种不同的模式吗?我认为你会浪费太多时间来编写序列化器/反序列化器。考虑使用 GSo...
  • 你说得对,我想了一个更简单的解决方案:我将编写一个中间件将每个“复杂”转换为具有简单引用的对象,然后我将像列表一样传递每个对象现在我得走了,我尽快给你举个例子
  • json、xml等整个序列化/反序列化业务,太短视了。例如。对象的 1:N 或 N:M 关系几乎是标准的,序列化框架不应该对此感到窒息,而是在这种情况下使用参考 id 进行适当的两次处理。它的。做到这一点并不难,也没有太多的表现惩罚。恕我直言,这些“标准”现在设计得太差了。
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多