Как разобрать указанный класс, который расширяет базовый класс, используя Gson? - PullRequest
0 голосов
/ 26 ноября 2018

Давайте сначала сформулируем (базовые) классы, которые являются частью этого:

// the data class. This contains our values
public class Data<T extends Annotation> {
    public transient final T info; // gson ignores transients
    public Data(Class<T> annotation) { info = getClass().getAnnotation(annotation); }
}

// the manager class, this contains numerous Data's
public class Manager<T> {
    protected final ArrayList<T> collection = new ArrayList<T>();
    public Collection<T> GetCollection() { return collection; }
}

Теперь предположим, что я реализовал вышеуказанные классы следующим образом:

// my implemented manager. It contains a bunch of MyBase objects
public class MyManager extends Manager<MyBase> {
    public MyManager() {
        collection.add(new MyCustomBase());
        // some more...
    }
}

public class MyBase extends MyData {
    // some stuff for my base, such as various methods for calculating and rendering
}

public MyData extends Data<MyData.MyInterface> {
    public String foo;
    MyData() {
        super(MyData.MyInterface.class);
        foo = info.foo(); // handle our interface variables, since interfaces cannot be directly modified
    }

    @Retention
    public @interface MyInterface {
        String foo();
    }

ДляРади понятного кода моя пользовательская база выглядит следующим образом:

@MyData.MyInterface(foo = "bar")
public class CustomBase extends MyBase {
    // other various methods for rendering and calculating, some events in here too
}

Теперь, в GSON, я хотел бы распечатать информацию из MyData.Вот как я пытался это сделать:

public class Config {
    // store the 'Managers' which we want to save the data of inside of an arrayList, and then iterate through them and their contents for 'Data', then just save it.
//...
Gson gson = new GsonBuilder().setPrettyPrinting().create();
PrintWriter writer = new PrintWriter(myJSON);
for (Manager m : managerList) {
    for (Object o : m.GetCollection()) {
        Data d = (Data) o;
        // expected result, a json with "foo": bar
        writer.println(gson.toJson(d)); // this doesn't work, throws a stack overflow
    }

    writer.close();
}

К сожалению, этот подход не работает.По какой-то странной причине он вызывает переполнение стека.Что может быть лучшим подходом для этого?

Редактировать: я не буду обрабатывать интерфейс напрямую, так как foo, или любые другие значения будут меняться в течение программы.

1 Ответ

0 голосов
/ 26 ноября 2018

Мне удалось избежать этой проблемы, используя аннотацию @Expose:

public MyData {
    @Expose public String foo;
}

Затем, при создании Gson с помощью GsonBuilder, просто используйте excludeFieldWithoutExposeAnnotation().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...