Как стать автором
Обновить

Комментарии 8

Для генерации Parcelable есть AutoParcel, генерирует в compile-time, для JSON есть Instagram-Json-Parser, тоже compile-time генерация кода, но его я еще не использовал.
НЛО прилетело и опубликовало эту надпись здесь
Flexjson
В отличие от Gson, корректно сериализует это:

Map<Integer, GoodsItem> mapItems = new HashMap<Integer, GoodsItem>() {{
    put(1, new GoodsItem("Samsung", 51200.6f));
    put(2, new GoodsItem("Lg", 5400.6f));
    put(3, new GoodsItem("Alcatel", 4500.6f));
}};

Gson же на такую заявку молча отвечает null.
Потому что в таком случае надо писать явно

String jsonStr = gson1.toJson(mapItems, HashMap.class);

Тогда все будет работать. Использование такого формата инициализации считается bad practise, так как на самом деле этот код создаст inner class и тип у mapItems будет не HashMap, а inner подкласс наследник от HashMap (можете увидит эту магию в любом дебагере). К тому же такого формат инициализации может привести к утечки памяти. В целом, это скорее глюки (точнее не очень ожидаемое поведение) компилятора Java. Ну и лучше вообще никогда не иницилизировать так map'ы (может за исключением явных константных map)
Если интересно, то статический анализатор Idea в умеренно-параноидальном режиме увидев такое выдаст кучу непечатных слов…
примерно вот таких...
HashMap<Integer, String>' does not define 'clone()'
Reports classes which implement the Cloneable interface, but which do not override the clone() method. Such classes use the default implementation of clone(), which is often not the desired behavior.

Anonymous class 'HashMap<Integer, String>' may be a named 'static' inner class
Reports any anonymous classes which may safely be made into a named static inner class. An anonymous class may be static if it doesn't explicitly reference its enclosing instance or local variables from its surrounding method.
A static inner class does not keep an implicit reference to its enclosing instance. This prevents a common cause of memory leaks and uses less memory per instance of the class.

Anonymous class explicitly extends 'java.util.HashMap'
Reports any clases which extend concrete classes of type java.util.Collection or java.util.Map. Subclassing collection types is a common practice of novice object-oriented developers, but is considerably more brittle than delegating collection calls.

Double brace initialization
Reports Double Brace Initialization. Double brace initialization can cause memory leaks when used from a non-static context, because the anonymous class created will maintain a reference to the surrounding object. It has worse performance than regular initialization because of the additional class loading required. It can cause equals() comparisons to fail, if the equals() method does not accept subclasses as parameter (see link above). And finally, it cannot be combined with Java 7 diamond operator, because that cannot be used with anonymous classes.

Inner class 'HashMap<Integer, String>' does not define a 'serialVersionUID' field
Reports Serializable non-static inner classes which do not provide a serialVersionUID field. Without a serialVersionUID field, any change to a class will make previously serialized versions unreadable. It is strongly recommended that Serializable non-static inner classes have a serialVersionUID field, otherwise the default serialization algorithm may result in serialized versions being incompatible between compilers, due to differences in synthetic accessor methods.

Inner class 'HashMap<Integer, String>' is serializable while its outer class is not
Reports Serializable non-static inner classes whose outer classes are non-Serializable. Such classes are unlikely to serialize correctly, due to implicit references from the inner to outer class.
Не знал этого, спасибо. Видимо, это судьба Java — добавлять фичи, из которых торчат детали реализации (generics с пресловутым type erasure, лямбды, для которых нужно объявлять интерфейсы). Совместимость, ынтырпрайз, все дела.
«Было бы интересно узнать, чем пользуетесь вы в своих проектах»
GSON + реализую Parcelable интерфейс.
Честно говоря не понял смысла шпаргалки, GSON с любой коллекцией и вообще с любым объектом (ну почти любым) работает одинаково

Сеариализация: строка_json = new Gson().toJson(объект_или_коллекция);
Десериализация: Объект = new Gson().fromJson(строка_json, тип_объекта_или_коллекции);

Достаточно запомнить только это, а все форматы представлений объектов и коллекций абсолютно типовые для json'a.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации