Gson.toJson () и наследование от универсального класса - PullRequest
1 голос
/ 16 сентября 2010

У меня есть следующий класс:

public static class TestSomething {

    Integer test;

    public TestSomething(Integer test) {
        this.test = test;
    }

    // getter and setter for test
}

Хорошо, теперь создайте коллекцию этого класса и сериализуйте ее с помощью Gson:

Collection<TestSomething> tests = Arrays.asList(
    new TestSomething(1), 
    new TestSomething(2), 
    new TestSomething(3)
);
String json = new Gson().toJson(tests, new TypeToken<Collection<TestSomething>>() {}.getType());

После этого строка String jsonустановлен на

[{"test":1},{"test":2},{"test":3}]

Что здорово.

Но теперь все мои классы моделей наследуются от универсального типа Identifiable<T>, который предоставляет только два метода T getId() и void setId(T),Поэтому я изменяю класс TestSomething сверху на

public static class TestSomething extends Identifiable<Long> {
    // same as above
}

Когда я пытаюсь указать это через Gson.toJson(), у Gson возникает следующее исключение:

java.lang.UnsupportedOperationException: Expecting parameterized type, got class path.to.TestSomething.
 Are you missing the use of TypeToken idiom?
 See http://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Gener
        at com.google.gson.TypeInfoFactory.getActualType(TypeInfoFactory.java:97)
        ...

Что мне нужно сделать, чтобы получить эту работу?

Ответы [ 2 ]

0 голосов
/ 10 июня 2011

Возможно, эта проблема была решена в одном из выпусков Gson, более новых, чем тот, который использовался первоначальным спрашивающим, поскольку пример в исходном вопросе теперь сериализуется, как и ожидалось.

0 голосов
/ 23 ноября 2010

Я не знаю ответа, но я знаю, что определение универсального типа - это непростая задача: правильно определить полное разрешение типа от интерфейса с параметром типа T до объявления универсального параметра (T = Long).В этих случаях недостаточно проверять параметры объекта Method, но также разрешать параметры универсального типа.Это наиболее вероятно, что вызывает проблемы;это может быть ошибка в Gson.

Поскольку вы сериализуете вещи, возможно, вы могли бы просто пропустить любые объявления типов?Хотя ваш TypeToken подходит для варианта использования, возможно, он сбивает с толку Gson.

Но на случай, если вы не сможете заставить Gson работать с этим, я знаю, что другие библиотеки JSON Джексон могут справитьсятакие случаи правильно.

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