2013-01-13 12 views
5

Używamy serializacji JSON z Jacksonem do ujawnienia wewnętrznego stanu systemu dla właściwości debugowania.Jak serializować pola przejściowe za pomocą jackson?

Domyślnie jackson nie szereguje zmiennych przejściowych - ale ja również chcę je przekształcić do postaci szeregowej. Jak można przekształcić te pola do postaci szeregowej?

Jednym ze sposobów, w jaki znam, jest dostarczenie pobierających dla tych pól - ale nie chcę tego robić, ponieważ mam pewne metody getX, których nie chcę wywoływać (na przykład, istnieje kilka pobierających które zmieniają stan obiektów).

Wiem, że mogę utworzyć adnotację, ale naprawdę chcę tego uniknąć.

Moje pytanie brzmi: Czy istnieje sposób na skonfigurowanie jacksona do serializacji wszystkich pól obiektów? zawierają przejściowe.

+1

Jeśli chcesz pola @ javax.persistence.Transient serializacji, patrz [odpowiedź Gere za] (http://stackoverflow.com/a/29109806/606662): –

+0

uzgodnione z @Markus Pscheidt – dirai

Odpowiedz

6

Nie sądzę, żeby Jackson wspierał jakąkolwiek konfigurację, aby umożliwić jej serializację pola przejściowego. Jest kwestią otwartą, aby dodać tę funkcję, ale jest stary i nie został skierowany (o ile mogę powiedzieć): http://jira.codehaus.org/browse/JACKSON-623

Więc moje pytanie brzmi: Czy istnieje sposób ustawiania Jackson do serializacji wszystkie pola obiektów? zawierają przejściowe.

Więc, aby odpowiedzieć na twoje pytanie, nie.

Niektóre inne narzędzia JSON Java, takie jak GSON , obsługują opcję konfigurowania serializacji zmiennych przejściowych. Jeśli możesz użyć innego narzędzia, możesz to sprawdzić (w przypadku GSON patrz: https://sites.google.com/site/gson/gson-user-guide).

Aby nieco się rozszerzyć, możesz spróbować zastosować inne podejście.

Po pierwsze, nie należy próbować przekształcać do postaci szeregowej pola przejściowego. Ostatecznie definicja "przejściowa" to "nie serializuj tego". Niemniej jednak mogę wymyślić kilka konkretnych sytuacji, w których może to być konieczne lub co najmniej wygodne (np. Podczas pracy z kodem, którego nie można modyfikować lub takich). Mimo to w 99% przypadków odpowiedź brzmi: nie rób tego. Zmień to pole, aby nie było przejściowe, jeśli potrzebujesz serializacji. Jeśli masz wiele kontekstów, w których używasz tego samego pola i chcesz je serializować w jednym (na przykład JSON), a nie serializować w innym (na przykład java.io), powinieneś utworzyć niestandardowy serializator dla przypadku, w którym nie chcesz tego, zamiast nadużywać słowa kluczowego.

Po drugie, jeśli chodzi o używanie gettera i posiadanie "niektórych modułów pobierających, które zmieniają stan obiektów", należy również tego unikać. Może to prowadzić do różnych niezamierzonych konsekwencji. I technicznie, to nie jest getter, to jest seter. Mam na myśli to, że jeśli mutuje stan, masz mutator (seter), a nie accessor (getter), nawet jeśli nazwiesz go zgodnie z konwencją "get" i zwrócisz kilka rzeczy.

0

Można utworzyć niestandardowy program pobierający dla tego pola przejściowego i użyć atrybutu @XmlElement. Nie ma znaczenia nazwa tego gettera.

Na przykład:

public class Person { 

    @XmlTransient private String lastname; 

    @XmlElement(name="lastname") 
    public String getAnyNameOfMethod(){ 
     return lastname; 
    } 

} 
10

Moje rozwiązanie z Jackson 2.4.3:

private static final ObjectMapper mapper = 
     new ObjectMapper(){{ 

      Hibernate4Module module = new Hibernate4Module(); 
      module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION); 
      registerModule(module); 

     }}; 
Powiązane problemy