我尝试分析Projects及其测试用例,以了解测试方法中哪些方法实际更改了测试类(对象)字段的值。我正在使用Gson序列化这些对象,以便在执行测试之前和之后比较生成的String。
这里我遇到了StackOverflowError
,因为有些对象有循环引用。我搜索了一个结果,但我找到的只是序列化的答案,其中序列化的对象是已知的和可访问的(我没有,因为我动态分配来自项目的不同类来分析)。
有人知道如何实现可以处理这些循环引用的通用序列化器。
我的想法如下:
Variable.java
(下方)中使用排除策略,但是因为我
不懂课,我不知道怎么实现这个
策略。JsonSerializer
但又一次,我不知道如何。 ClassTypeAdapter.java
(用于序列化所有对象的简单适配器)
import java.lang.reflect.Type;
public class ClassTypeAdapter implements JsonSerializer<Class<?>> {
@Override
public JsonElement serialize(Class<?> src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getName());
}
}
Variable.java
public abstract class Variable {
private String value; // Json string
private STATE state;
public Variable(Object value) {
Gson gson = new GsonBuilder()
// .setExclusionStrategies(new ExclusionStrategy() {
// public boolean shouldSkipClass(Class<?> clazz) { return false; }
// public boolean shouldSkipField(FieldAttributes f) { return false; } })
.registerTypeAdapter(Class.class, new ClassTypeAdapter())
.create();
this.value = gson.toJson(value);
this.state = STATE.NOT_CHANGED;
}
public void Update(String newValue) {
if (!this.value.equals(newValue)) this.state = STATE.CHANGED;
this.value = newValue;
}
}
public enum STATE { CHANGED, NOT_CHANGED; }
编辑:问题
或者Gson是否有任何替代序列化,这使得更容易序列化未知的循环引用?
有人知道如何在运行时定义的对象上使用DataTransferObject模式,使其对Gson更友好吗?