您绝对应该使用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);
否则将无法编译。也许现在是固定的。



