Wyobraźmy mam następujący POJO:(de-) Serializować Bean w sposób niestandardowy w czasie wykonywania
class Pojo {
String s;
Object o;
Map<String, String> m;
}
A w czasie wykonywania, chcę domyślnej serializacji/deserializacji dla wszystkich nieruchomości z wyjątkiem jednego. Zazwyczaj chcę zastąpić pole identyfikatorem w bazie danych podczas serializacji, podobnie jak this other question.
Na przykład, chcę wymienić o
przez ciąg uzyskanej od mapowania zewnętrznego (na przykład: object1
< => "123" i object2
< => "456"):
- serializacji: czytaj
o
i zastąpić (więc jeślio
jestobject1
, szeregować jako ciąg znaków „123”) - deserializacji: read „123”, sprawdź jakiś stół, aby uzyskać oryginalną wartość
o
powrotem (tjobject1
), odtworzeniePojo
objec tzo = object1
.
Rozumiem, że moduły byłby jeden sposób, aby to zrobić, ale nie jestem pewien, w jaki sposób z nich korzystać przy zachowaniu automatycznego BeanSerializer/Deserializator o właściwościach, które nie muszą być zmienione.
Czy ktoś może podać przykład (nawet wymyślony) lub podejście alternatywne?
Uwagi:
- Nie mogę używać adnotacji lub wstawek jak zmiany są znane w czasie kompilacji (czyli wszelkie właściwości mogą zostać zmienione w taki sposób, że nie można jej ustalić).
- This other question wskazuje na użycie CustomSerializerFactory, który wydaje się wykonywać zadanie. Niestety oficjalna strona wskazuje, że zamiast tego powinny być używane moduły: it is not the recommended approach any more.
Edit
być nieco jaśniejsze, mogę wykonać następujące czynności wstawkami na przykład:
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);
z następującym mixin:
abstract class PojoMixIn {
@JsonIgnore Object o;
}
A następnie dodaj wymagany ciąg do treści JSON. Ale będę musiał wiedzieć podczas kompilacji, że to jest pole o
, które należy zastąpić, a czego nie.
> Nie mogę używać adnotacji lub wstawek jak zmiany są znane w czasie kompilacji (czyli wszelkie właściwości może być> zmienione w taki sposób, to nie jest możliwe do określenia). Czy możesz wyjaśnić, proszę? Bardzo zdezorientowany, ponieważ wszystko powyżej nagłówka "Notatki:" jest statyczne i znane podczas kompilacji. Czy klasy (Pojo) i pola Pojo nie są znane z góry? –
Sugerujesz, że nie jest bezpiecznie przyjmować żadnej struktury klasowej? Raw (untyped/simple) powiązanie danych deserializuje strukturę JSON obiektu jako LinkedHashMap i strukturę JSON tablicy jako ArrayList
@GlenBest Tak, klasa Pojo może być mniej więcej niczym. Podałem przykład, w którym 'o' jest zastępowane przez ciąg. Ale później w programie może to być 'm', które powinno być zastąpione przez jakiś String i' o' serializowane "normalnie". – assylias