Gson jest znany i używany ze względu na łatwość użytkowania. Jeśli chcesz prędkości, musisz popatrzeć na super popularnego Jacksona Jsona.
Testowałem i porównywałem zarówno Gsona, jak i Jacksona i mogę powiedzieć, że w niektórych przypadkach Jackson jest 15 razy szybszy zarówno w przypadku serializacji, jak i deserializacji, nawet w przypadku bardzo dużych obiektów.
Aby uzyskać podobne zachowanie jako JSON używam następujące ustawienia
public enum JsonMapper {
INSTANCE;
private final ObjectMapper mapper;
private JsonMapper() {
mapper = new ObjectMapper();
VisibilityChecker<?> visibilityChecker = mapper.getSerializationConfig().getDefaultVisibilityChecker();
mapper.setVisibilityChecker(visibilityChecker
.withFieldVisibility(Visibility.ANY)
.withCreatorVisibility(Visibility.NONE)
.withGetterVisibility(Visibility.NONE)
.withSetterVisibility(Visibility.NONE)
.withIsGetterVisibility(Visibility.NONE));
}
public ObjectMapper mapper() {
return mapper;
}
}
To okaże się dać te same ciągi json jak Gson dla tych samych obiektów. Możesz go ustawić tak, aby używał tylko pobierających i ustawiających, jeśli chcesz. Radziłbym przeczytać o wszystkich adnotacjach json json dotyczących obsługi podtypów (użyteczne dla systemów typu RPC).
Moje przypadki użycia: Używam jacksona jako serializacji, gdy chcę zapisać obiekty typu blob w systemach pamięci masowej (Redis, Cassandra, Mongo, ... czasami też mysql). Używam go także jako serializacji dla API w stylu RPC dla systemów o dość dużym natężeniu ruchu, chociaż wolę używać Protobuf do tych, gdy jest to możliwe. W tym ostatnim przypadku używam Jacksona do bezpośredniego serializowania do bajtu [] lub strumienia dla lepszej wydajności.
Ostatnia uwaga: Program do odwzorowania obiektów jest bezpieczny dla wątków i posiadanie jednej statycznej instancji takiej, jak w przykładzie, który właśnie przesłałem, uniemożliwi ci lekkie naświetlenie.
EDIT: Mam świadomość, że mój przykład nie wynika wiele najlepszych praktyk wskazał na stronie jackson ale pozwala mi mieć proste do zrozumienia kodu, który wygląda jakby Gson.toJson
i Gson.fromJson
(co zacząłem zbyt i włączone później do Jackson)
Gson.toJson(object)
=>JsonMapper.INSTANCE.mapper().writeValueAsString(object)
Gson.fromJson(object, clazz)
=>JsonMapper.INSTANCE.mapper().readValue(jsonString, clazz);
fastJson jest biblioteką C# ... – melbic