Как реализовать TypeAdapterFactory в Gson?

Как реализовать тип TypeAdapterFactory в Gson?

Основной метод создания – общий. Зачем?

Метод регистрации registerTypeAdapterFactory () не получает тип аргумента типа. Итак, как Gson знает, какие classы обрабатываются фабрикой?

Должен ли я использовать один завод для нескольких classов или я могу реализовать его для многих classов?

Если я реализую один завод для нескольких classов, то что мне следует возвращать в случае аргумента типа вне домена?

Когда вы регистрируете адаптер обычного типа ( GsonBuilder.registerTypeAdapter ), он генерирует только адаптер типа для определенного classа THAT. Например:

 public abstract class Animal { abstract void speak(); } public class Dog extends Animal { private final String speech = "woof"; public void speak() { System.out.println(speech); } } // in some gson related method gsonBuilder.registerTypeAdapter(Animal.class, myTypeAdapterObject); Gson g = gsonBuilder.create(); Dog dog = new Dog(); System.out.println(g.toJson(dog)); 

Если вы это Gson , Gson не будет использовать ваш myTypeAdapterObject , он будет использовать адаптер типа по умолчанию для Object .

Итак, как вы можете создать объект адаптера типа, который может преобразовывать ЛЮБОЙ подclass Animal в Json? Создайте TypeAdapterFactory ! Фабрика может совпадать с общим типом и classом TypeToken . Вы должны вернуть значение null, если ваш TypeAdapterFactory не знает, как обращаться с объектом этого типа.

Другая вещь, TypeAdapterFactory может использовать TypeAdapterFactory заключается в том, что вы не можете TypeAdapterFactory CHAIN-адаптеры любым другим способом. По умолчанию Gson не передает ваш экземпляр Gson в методы read или write TypeAdapter . Поэтому, если у вас есть такой объект:

 public class MyOuterClass { private MyInnerClass inner; } 

TypeAdapter написать свой TypeAdapter который знает, как использовать TypeAdapter не используя TypeAdapterFactory . Метод TypeAdapterFactory.create Gson экземпляр Gson , который позволяет вам научить ваш TypeAdapter как сериализовать поле MyInnerClass .


Как правило, вот хороший стандартный способ начать писать реализацию TypeAdapterFactory :

 public enum FooAdapterFactory implements TypeAdapterFactory { INSTANCE; // Josh Bloch's Enum singleton pattern @SuppressWarnings("unchecked") @Override public  TypeAdapter create(Gson gson, TypeToken type) { if (!Foo.class.isAssignableFrom(type.getRawType())) return null; // Note: You have access to the `gson` object here; you can access other deserializers using gson.getAdapter and pass them into your constructor return (TypeAdapter) new FooAdapter(); } private static class FooAdapter extends TypeAdapter { @Override public void write(JsonWriter out, Foo value) { // your code } @Override public Foo read(JsonReader in) throws IOException { // your code } } } 
  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Сериализация classа, который содержит std :: string
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • Json Сериализация Java, которая работает с GWT
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Как сериализовать lambda?
  • Может ли Json.NET сериализовать / десериализовать в / из streamа?
  • Сохранение / загрузка данных в Unity
  • Игнорирование нулевых полей в Json.net
  • Как настроить сериализацию списка объектов JAXB для JSON?
  • Java: объект для байта и байт для конвертера объектов (для Tokyo Cabinet)
  • Interesting Posts

    Как легко и непрерывно контролировать температуру процессора, используя только «датчики» (без виджета gui)?

    Я пытаюсь найти поблизости такие места, как банки, рестораны, банкоматы внутри рисованной области на картах Google в андроиде

    Глобальная переменная в нескольких файлах

    Как сжать загрузочный раздел Windows 7 с помощью неподвижных файлов

    Что такое mysql error 1025 (HY000): ошибка при переименовании ‘./foo’ (errno: 150) означает?

    Как я могу очистить установку MacPorts?

    Присвоение строк массивам символов

    Почему использование alloca () не считается хорошей практикой?

    Узнайте, существует ли имя пользователя

    HttpServletResponse sendRedirect постоянный

    Что такое хорошая библиотека для анализа математических выражений в java?

    Rails 4 путь изображения, URL-адрес изображения и URL-адрес ресурса больше не работают в файлах SCSS

    Почему запросы Python игнорируют параметр проверки?

    Подключение к WebSphere MQ в Java с помощью SSL / Keystore

    Почему scanf () нуждается в «% lf» для удвоений, когда printf () в порядке с «% f»?

    Давайте будем гением компьютера.