Производительность сериализации и Google Android - PullRequest
12 голосов
/ 27 мая 2010

Я ищу совет, чтобы ускорить производительность сериализации, особенно при использовании Google Android. Для проекта, над которым я работаю, я пытаюсь передать пару сотен объектов с сервера в приложение Android и прохожу различные этапы, чтобы получить необходимую мне производительность.

Сначала я попробовал ужасный парсер XML, который я взломал вместе, используя Scanner специально для этого проекта, и это привело к невероятно низкой производительности при загрузке объектов (~ 5 минут для файла размером 300 КБ). Затем я отошел от этого и сделал мои классы реализующими Serializable и записал ArrayList объектов, которые у меня были, в файл. Чтение этого файла в объекты, которые уже были загружены Android, заняло ~ 15-30 секунд для сериализованного файла ~ 100 КБ. Я все еще нахожу это совершенно неприемлемым для приложения Android, так как мое приложение требует загрузки данных при запуске приложения.

Я кратко прочитал о Externalizable и о том, как он может повысить производительность, но я не уверен, как реализовать его с помощью вложенных классов. Сейчас я пытаюсь сохранить ArrayList следующего класса с вложенными классами под ним.

public class MealMenu implements Serializable{
private String commonsName;
private long startMillis, endMillis, modMillis;
private ArrayList<Venue> venues;
private String mealName;
}

И место проведения класса:

public class Venue implements Serializable{
private String name;
private ArrayList<FoodItem> foodItems;
}

И класс FoodItem:

public class FoodItem implements Serializable{
private String name;
private boolean vegan;
private boolean vegetarian;
}

ЕСЛИ Externalizable - это способ повысить производительность, есть ли какая-либо информация о том, как java вызывает методы в объектах, когда вы пытаетесь его записать? Я не уверен, нужно ли мне реализовывать это в родительском классе или как я буду сериализовать вложенные объекты в каждом объекте.

1 Ответ

10 голосов
/ 27 мая 2010

Никогда не используйте Serializable в разных архитектурах. У вас нет возможности узнать, будет ли виртуальная машина Dalvik иметь совместимую сериализацию с версией Java вашего сервера. Даже если он работает сегодня, он может не с обновлениями на обоих концах. Всегда выбирайте то, что разработано специально для работы в разных архитектурах.

Опции включают в себя:

  • Протоколные буферы
  • Apache Thrift (полезная упаковка, не обязательно RPC)
  • XML (вы не упомянули, какой парсер вы использовали - если вы использовали DOM, попробуйте SAX)
  • JSON (как сообщается, JSON-анализатор Джексона работает быстрее, чем синтаксический анализатор org.json, встроенный в Android)

Кроме того, загрузка 300К данных при запуске приложения является причиной проблем. Пожалуйста, рассмотрите возможность использования SQLite, чтобы позволить вам работать только с битами данных, которые вам нужны одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...