2013-03-18 16 views
13

Pomyślnie zacząłem używać GSON do serializowania i dekerealizacji hierarchii obiektów w mojej aplikacji Android.Kończenie budowy obiektu po deserializacji GSON

Niektóre obiekty są serializowane mają elementy, które muszę oznaczyć jako transient (lub w inny sposób użyć alternatywnych adnotacji GSON, aby zapobiec ich serializacji), ponieważ są one odniesieniami do obiektów, których nie chcę serializować jako części wyjściowego JSON strunowy. Odwołania te dotyczą obiektów, które muszą być oddzielnie konstruowane w inny sposób.

Gdy struktura jest ponownie szeregowana z powrotem do obiektów Java, w pewnym momencie muszę wypełnić te odniesienia. Mogłem to łatwo zrobić, używając serii metod typu setXXX(), ale do tego czasu obiekty te są w stanie niepełnym. Zastanawiam się więc, czy istnieje bardziej zdecydowane podejście do tego.

Sposoby myślałem tak daleko:

  • Czy obiekty rzucić RuntimeException (lub coś bardziej odpowiednie), jeżeli są one w stanie niekompletnym; to znaczy, jeśli poproszono ich o wykonanie pracy, gdy nie uruchomiono metody inicjalizacji.

  • Rozdziel dane serializowanych bitów na osobny obiekt modelu danych. Innymi słowy, usuń rzeczy, których nie można serializować. Po dekrealizacji serialu GSON, buduj moje "prawdziwe" obiekty, używając tych obiektów danych w ich składzie. Wydaje się to pogarszać wygodę korzystania z GSON w pewien sposób.

  • Napisz niestandardowy deserializator dla GSON, aby obsłużyć specjalne tworzenie tych obiektów.

Odpowiedz

5

I prawdopodobnie wykonać drugie podejście, bo jak zwykle projektować swoje aplikacje, wszystko, co potrzebne, aby być szeregowane/rozszeregować jest naprawdę po prostu stare dane lub POJOs jeśli wolisz. Jeśli potrzebuję dostosować/skonfigurować API serializacji, aby zrobić to, co chcę, staram się uprościć to, co jest serializowane, więc API serializacji nie potrzebuje dodatkowych konfiguracji.

Tak więc, jeśli mam bardziej skomplikowany model danych, którego części nie mają być przekształcane do postaci szeregowej/deserialized, wtedy wyciągam z niego prostszy zestaw POJO, jako koncepcyjnie oddzielny model danych, aby uczestniczyć w serializacji/deserializacja. To naprawdę wymaga dodatkowego kroku do mapowania pomiędzy dwoma modelami danych, ale zazwyczaj jest to również bardzo proste.

Jeśli preferowane jest trzecie podejście, zwróć uwagę także na the Instance Creator feature, ponieważ może to być kolejny użyteczny chwyt w dostosowywaniu procesu deserializacji.

+0

Wielkie dzięki. Myślę, że powinienem wziąć to drugie podejście, ponieważ innym problemem jest to, że moje wyjście JSON, które mam obecnie, jest bardzo ściśle powiązane z rzeczywistą implementacją klasy, i jestem również zaniepokojony wersjonowaniem (mogłoby to być kłopotliwe, gdyby plik JSON był ładowany do nowszej aplikacji vesion, gdzie zmieniły się struktury klasowe). Odwzorowanie klas aplikacji na drzewie klas "modelowych" w celu zachowania trwałości wydaje się być dobrym sposobem na rozwiązanie tego problemu.Głupie pytanie, ale jakiej terminologii używałbyś, aby odróżnić prawdziwą klasę pracującą od klasy modelu danych? – Trevor

+0

Może ViewModel lub PersistenceModel lub SerializedModel, lub JsonModel, lub IntegrationModel, lub ServiceModel, lub coś innego. –

8

Wyjazd https://github.com/julman99/gson-fire

Jest to biblioteka zrobiłem który rozciąga Gson obsłużyć takich przypadkach Post-serializacji i post-deserializacji

także posiada wiele innych ciekawych funkcji, które mam potrzebne w miarę upływu czasu z Gson .

Powiązane problemy