如何序列化包含循环引用的任何给定类

时间:2017-04-27 09:49:07

标签: java serialization gson stack-overflow circular-reference

我尝试分析Projects及其测试用例,以了解测试方法中哪些方法实际更改了测试类(对象)字段的值。我正在使用Gson序列化这些对象,以便在执行测试之前和之后比较生成的String。

这里我遇到了StackOverflowError,因为有些对象有循环引用。我搜索了一个结果,但我找到的只是序列化的答案,其中序列化的对象是已知的和可访问的(我没有,因为我动态分配来自项目的不同类来分析)。

有人知道如何实现可以处理这些循环引用的通用序列化器。

我的想法如下:

  1. Variable.java(下方)中使用排除策略,但是因为我 不懂课,我不知道怎么实现这个 策略。
  2. 由于我不需要反序列化,我可以简单地设置一个递归
    深度限制,但我发现无法用Gson实现这一点。
  3. 也许有可能有一个好方法来解决这个问题 JsonSerializer但又一次,我不知道如何。
  4. 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更友好吗?

0 个答案:

没有答案