Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gson和参考文献_Java_Android_Gson - Fatal编程技术网

Java gson和参考文献

Java gson和参考文献,java,android,gson,Java,Android,Gson,我有一个安卓系统的小应用程序,它必须通过一个套接字与服务器通信。问题是:我可以使用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;

我有一个安卓系统的小应用程序,它必须通过一个套接字与服务器通信。问题是:我可以使用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();
    }
}
像这样的课

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)
我获得的a对象

{“b1”:{“n”:1},“b2”:{“n”:1},“b3”:{“n”:2}

但我更希望有一些链接

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


你能帮我吗?我读了很多页,但什么也没找到!

JSON是一种为数据交换设计的标准。这样,它就有一些规则需要遵守,以便“标准化”通信

如果要使用GSon序列化数据,则不能更改数据的序列化方式。这就是模式

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


祝您好运

看看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('\"', '\''));

我也花了很多时间从另一个角度来实现这一点,但找不到任何满意的答案。请参阅。似乎没有本机对这一点的支持。但是,如果您的服务器可以帮助您识别json中的对象类型,那么可能会有一些定制的解决方案。感谢您的回答。我还编写了服务器,因此我可以n构造串行化器和反序列化器,谢谢雷纳托,现在我将检查如何编写串行化器和解串器。我认为有一个JET系统,但是如果它不存在,我可以写它。你真的需要数据有这个不同的模式吗?我想你会浪费太多的时间来编写串行化器/解串器。考虑使用GSON……Your。是的,我想到了一个更简单的解决方案:我将编写一个中间件来转换每个“复杂”对于一个有简单引用的对象,然后我会像列表一样传递每个对象现在我要去,我会尽快给你一个例子json、xml和其他东西的整个序列化/反序列化业务都是非常短视的。例如,对象的1:N或N:M关系是非常标准的,序列化框架不应该因此而受阻但是,对于这种情况,使用参考ID进行适当的两次传递处理。这并不困难,也没有太多的性能惩罚。这些“标准”现在设计得太差了。Jesse这正是我所需要的!非常感谢!!!我没有找到它,因为它没有文档记录,但它非常有用!