Предположим, что у меня есть следующее POJO:
class Pojo {
String s;
Object o;
Map<String, String> m;
}
И во время выполнения, я хочу сериализации/десериализации по умолчанию для всех свойств, кроме одного. Как правило, я хочу заменить поле его идентификатором в базе данных при сериализации, аналогично этому другому вопросу.
Например, я хочу заменить o
на строку, полученную из внешнего сопоставления (например: object1
<= > "123" и object2
<= > "456" ):
- Сериализация: прочитайте
o
и замените (так что еслиo
естьobject1
, сериализуйтесь как строка "123" ) - deserialization: прочитайте "123" , запросите некоторую таблицу, чтобы получить исходное значение
o
назад (т.е.object1
), воссоздайте объектPojo
с помощьюo = object1
.
Я понимаю, что Модули будут одним из способов сделать это, но я не уверен, как их использовать, сохраняя автоматический BeanSerializer/Deserializer для свойств, которые не нужно изменять.
Может ли кто-нибудь привести пример (даже надуманный) или альтернативный подход?
Примечания:
- Я не могу использовать аннотации или Mixins, поскольку изменения неизвестны во время компиляции (т.е. любые свойства могут быть изменены способом, который не может быть определен).
- Этот другой вопрос указывает на использование CustomSerializerFactory, который, похоже, выполняет эту работу. К сожалению, на официальном сайте указано, что это не рекомендуемый подход и что модули должны использоваться вместо этого.
Edit
Чтобы быть немного яснее, я могу сделать следующее с помощью Mixins, например:
ObjectMapper mapper = new ObjectMapper(MongoBsonFactory.createFactory());
mapper.addMixInAnnotations(Pojo.class, PojoMixIn.class);
ObjectReader reader = mapper.reader(Pojo.class);
DBEncoder dbEncoder = DefaultDBEncoder.FACTORY.create();
OutputBuffer buffer = new BasicOutputBuffer();
dbEncoder.writeObject(buffer, o);
со следующим Mixin:
abstract class PojoMixIn {
@JsonIgnore Object o;
}
Затем добавьте нужную строку в содержимое JSON. Но во время компиляции мне нужно знать, что это поле o
, которое нужно заменить, чего я не делаю.