I have been trying to use Gson to serialize EMF (Eclipse modeling framework ) model objects to Json. However i've been getting stack overflow errors , which seem to occur when a class has its containment property set to true. Is their any known limitation to using GSON on EMF models ?
Linked below is the (rather simple) EMF model i'm trying to serialize. Note that the error DOES NOT occur if I make the containment property of "subblocks" inside Chip as false (in which case the JSON gets generated correctly) :
The data is instantiated and the Gson writer called as below :
Chip createChip = PackageFactory.eINSTANCE.createChip();
createChip.setChipName("hello");
createChip.setChipDesc("helloworld");;
subBlockFields createsubBlockFields = PackageFactory.eINSTANCE.createsubBlockFields();
createsubBlockFields.setField1("this is field1");
createsubBlockFields.setField2("this is field 2");
subBlock createsubBlock = PackageFactory.eINSTANCE.createsubBlock();
createsubBlock.setAge(3);
createsubBlock.setFieldName("this is subblock");
createsubBlock.setFields(createsubBlockFields);
createChip.getSubblocks().add(createsubBlock);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonpp = gson.toJson(createChip);
try{
FileWriter writer = new FileWriter ("C:\\Temp\\emftry.json");
writer.write(jsonpp);
writer.close();
}
Stack trace:
Exception in thread "main" java.lang.StackOverflowError
at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:366)
at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:366)
at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:408)
at java.util.LinkedHashMap$ValueIterator.<init>(LinkedHashMap.java:408)
at java.util.LinkedHashMap.newValueIterator(LinkedHashMap.java:418)
at java.util.HashMap$Values.iterator(HashMap.java:1038)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:197)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
.
.