栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Gson-使用InstanceCreator即时设置对象引用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Gson-使用InstanceCreator即时设置对象引用

您绝对应该使用GraphAdapterBuilder。

正如您在@Braj的回答下的评论中所说,

*由于某些原因将 *workshift
设置为瞬态,因此在序列化访问对象时不会将其序列化。如果未将其标记为瞬态,则序列化将陷入堆栈溢出异常-通过创建不可停止的循环

这有一个简单的解决方案。

工作班

public class Workshift {    private final transient Context context;    private final Visit visit;    //for testing    private String workshift_description;    public Workshift(Context context,String id) {        this.workshift_description=id;        this.context = context;        this.visit = new Visit(this);    }    public String getId() {        return workshift_description;    }    public void setId(String id) {        this.workshift_description = id;    }    public String toString() {        return "[Workshift element => { WD: "+this.workshift_description+", VD : "+this.visit.getVisit_description()+"}";    }}

Visit.java

public class Visit {    private final  Workshift workshift;    public Visit(Workshift ws) {        this.workshift = ws;    }    public String getVisit_description() {        return "visit containing  "+ workshift.getId();    }}

窍门在这里:

GsonBuilder gsonBuilder = new GsonBuilder();        new GraphAdapterBuilder()        .addType(Visit.class)        .addType(Workshift.class)        .registerOn(gsonBuilder);

放在一起

public static void main(String[] args) {        Workshift[] workshifts = new Workshift[10];        for (int i = 0; i < workshifts.length; i++) { //Replace Context(i) for the real one workshifts[i] = new Workshift(new Context(i), "Workshift#"         + i);        }        System.out.println("Original Workshifts array:");        for (int i = 0; i < workshifts.length; i++) { System.out.println(workshifts[i]);        }        System.out.println("===================================");        GsonBuilder gsonBuilder = new GsonBuilder();        new GraphAdapterBuilder()        .addType(Visit.class)        .addType(Workshift.class)        .registerOn(gsonBuilder);        Gson gson = gsonBuilder.setPrettyPrinting().create();        String serialized = gson.toJson(workshifts);        // System.out.println(serialized);        Workshift[] w_array = gson.fromJson(serialized, Workshift[].class);        // System.out.println(gson.toJson(w_array));        System.out.println("Des-serialized Workshifts array:");        for (int i = 0; i < w_array.length; i++) { System.out.println(w_array[i]);        }        System.out.println("===================================");

输出:

Original Workshifts array:[Workshift element => { WD: Workshift#0, VD : visit containing  Workshift#0}[Workshift element => { WD: Workshift#1, VD : visit containing  Workshift#1}[Workshift element => { WD: Workshift#2, VD : visit containing  Workshift#2}[Workshift element => { WD: Workshift#3, VD : visit containing  Workshift#3}[Workshift element => { WD: Workshift#4, VD : visit containing  Workshift#4}[Workshift element => { WD: Workshift#5, VD : visit containing  Workshift#5}[Workshift element => { WD: Workshift#6, VD : visit containing  Workshift#6}[Workshift element => { WD: Workshift#7, VD : visit containing  Workshift#7}[Workshift element => { WD: Workshift#8, VD : visit containing  Workshift#8}[Workshift element => { WD: Workshift#9, VD : visit containing  Workshift#9}===================================Des-serialized Workshifts array:[Workshift element => { WD: Workshift#0, VD : visit containing  Workshift#0}[Workshift element => { WD: Workshift#1, VD : visit containing  Workshift#1}[Workshift element => { WD: Workshift#2, VD : visit containing  Workshift#2}[Workshift element => { WD: Workshift#3, VD : visit containing  Workshift#3}[Workshift element => { WD: Workshift#4, VD : visit containing  Workshift#4}[Workshift element => { WD: Workshift#5, VD : visit containing  Workshift#5}[Workshift element => { WD: Workshift#6, VD : visit containing  Workshift#6}[Workshift element => { WD: Workshift#7, VD : visit containing  Workshift#7}[Workshift element => { WD: Workshift#8, VD : visit containing  Workshift#8}[Workshift element => { WD: Workshift#9, VD : visit containing  Workshift#9}===================================

没有StackOverflow错误。

如果您取消注释该行

// System.out.println(serialized);

输出如下:

[  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#0"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#1"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#2"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#3"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#4"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#5"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#6"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#7"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#8"    },    "0x2": {      "workshift": "0x1"    }  },  {    "0x1": {      "visit": "0x2",      "workshift_description": "Workshift#9"    },    "0x2": {      "workshift": "0x1"    }  }

]

这是因为Gson正在替换您的引用,以避免出现堆栈溢出异常。就像 模拟指针

希望能帮助到你。

注意: 请记住复制文件GraphAdapterBuilder.java并更改该行

private final ConstructorConstructor constructorConstructor = new ConstructorConstructor();

private final ConstructorConstructor constructorConstructor = newConstructorConstructor(instanceCreators);

否则将无法编译。也许现在是固定的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/498426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号