2015-12-02 2 views
0

Я видел примеры на SO исключения полей из сериализации во время выполнения. Мне нужно это сделать, но я бы хотел, чтобы Gson обрабатывал сериализацию всех полей, которые не исключаются.Исключить поля из сериализации Gson во время выполнения

Сложная часть заключается в том, что я не могу сначала выполнить сериализацию Gson, а затем изменить тип результата. Мне нужно как-то сначала сделать исключение, а затем сделать то, что остается сериализованным. Возможно ли это?

+0

Поправьте меня, если я ошибаюсь, но TypeAdapter это то, что делает сериализацию, это не было бы модифицировать результат, так как он сам по себе является формирование результата (JSON), как она идет, нет? – nickb

+0

@nickb Я видел пример на SO, где сериализация по умолчанию была делегирована с помощью TypeAdapter в библиотеку, затем результат был отредактирован с помощью TypeAdapter, чтобы удалить исключенные поля перед возвратом окончательного результата. –

+1

Интересно, есть ли у вас ссылка? Вероятно, это поможет лучше объяснить ваш вопрос, если вы сможете представить описанную вами реализацию вместе с объяснением ее недостатков. – nickb

ответ

0

Хорошо, с некоторыми экспериментами, и this helpful post, я смог сцепиться вместе, чтобы условно исключить издеваемое поле.

Причина, по которой я столкнулся со всей этой проблемой, заключается в том, что из-за окна Gson генерирует исключение, когда он встречает сфокусированные споки поля.

Для Spock мой чек, чтобы определить, является ли поле издевательством, - это увидеть, содержит ли имя класса значение, которое оно ссылается, подстроку EnhancerByCGLib.

Ниже, ResizingArrayQueueOfStrings.arrayFactory - это поле, которое может быть или не быть издевательством.

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

В результате JSON, когда поле издевалось и ResizingArrayQueueOfStrings сериализации является

queue { 
    "arrayFactory": "** mocked **",  
} 

иначе, это

queue { 
    "arrayFactory": {}, 
} 

Надеется, что это помогает другим с подобной необходимостью.

public class MockSerializer implements JsonSerializer<Object> { 

    @Override 
    public JsonElement serialize(Object src, Type typeOfSrc, JsonSerializationContext context) { 
     Gson gson = new Gson(); 
     String className = src.getClass().getName(); 
     boolean isMocked = className.contains("EnhancerByCGLIB"); 
     if (isMocked) return new JsonPrimitive("** mocked **"); 
     else return gson.toJsonTree(src); 
    } 

} 

public class ResizingArrayQueueOfStrings { 

    private ArrayFactory arrayFactory; 

    public String toString() { 
     Gson gson = new GsonBuilder() 
       .registerTypeAdapter(ArrayFactory.class, new MockSerializer()) 
       .setPrettyPrinting() 
       .create(); 
     return gson.toJson(this); 
    } 

} 
Смежные вопросы