2010-05-27 2 views
12

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

Сначала я попробовал ужасный синтаксический анализатор XML, который я взломал с помощью сканера специально для этого проекта, и это вызвало невероятно медленную производительность при загрузке объектов (~ 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; 
} 

IF Externalizable это путь для повышения производительности, есть ли информация о том, как Java вызывает методы в объектах, когда вы пытаетесь записать его? Я не уверен, что мне нужно реализовать его в родительском классе, и как бы я сделал сериализацию вложенных объектов внутри каждого объекта.

ответ

10

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

Варианты включают в себя:

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

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

+0

Не уверен, что я понимаю этот комментарий - с помощью 'Serializable' вам не нужно полагаться на механизм по умолчанию. Вы всегда можете определить свой собственный с помощью 'readFields()' et al. –

+1

И вы предполагаете, что эти поля последовательно кодируются по архитектурам. Сериализация предназначена для хранения для отдельной машины, а не для всех машин, а тем более для чипсетов и авторов VM. – CommonsWare

+0

Я перешел на базу данных SQLite, как вы сказали, и времена загрузки приложения значительно улучшились. Однако заполнение базы данных по-прежнему занимает огромное количество времени. В текущем проекте базы данных добавлялось ~ 3000 строк при заполнении базы данных, а также при добавлении нового контента.~ 2500 до одной таблицы, от 500 до другой и от 150 до третьей. Есть ли что-нибудь, что мы могли бы сделать неправильно в этом отношении? Для добавления строк в базу данных потребовалось, по крайней мере, минуту. Единственное, что приходит мне на ум, - это переработать наше использование базы данных, поэтому нам не нужно так много –

Смежные вопросы