Ответ 1
(Надеюсь) ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ
msgpack: 0.6.8
работает без проблем на Android.
msgpack-rpc: 0.7.0
работает на Android с одной оговоркой.
В частности, вам нужно добавить следующее в onCreate
для уровня API 8 (Android 2.2.1) и, возможно, ниже:
java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
из-за этой ошибки.
Если вы хотите увидеть простой пример, вот пара проектов, созданных для этой цели:
- https://github.com/mikkoz/msgpack-android-test-server/tree/master/msgpack-android-test-server
- https://github.com/mikkoz/msgpack-android-test-client/tree/master/msgpack-android-test-client
Предыдущие версии
UPDATE: с 0.6.7 msgpack должен быть совместим с Android (есть небольшая проблема исключения зависимостей). Проверьте текст ниже для msgpack-rpc (который также может быть адаптирован в будущем).
ПРИМЕЧАНИЕ. Если вы также используете msgpack-rpc, вам необходимо выполнить следующие действия:
- Загрузите источник msgpack-rpc из git://github.com/msgpack/msgpack-rpc.git(в частности, папку "java" ).
- Измените основную версию артефакта msgpack на тот, который вы создали.
- В org.msgpack.rpc.loop.netty.NettyEventLoop измените NioClientSocketChannelFactory на OioClientSocketChannelFactory (getWorkerExecutor()).
- Создайте MessagePack-RPC так же, как и в случае основного MessagePack JAR (см. шаг 11 выше).
Замена NettyEventLoop связана с этой проблемой: http://markmail.org/message/ypa3nrr64kzsyfsa.
Важно: Я тестировал только синхронную связь. Асинхронный может не работать.
И вот причина, по которой msgpack не работает с Android до 0.6.7
:
Причиной ошибки является то, что MessagePack использует несколько классов java.beans, которые не включены в Android SDK. Вероятно, вы используете аннотацию MessagePackBeans.
Это аналогичная проблема для описанной здесь, для которой описано общее решение здесь, К сожалению, в нашем случае это требует восстановления msgpack. Вот что я сделал (вы почти наверняка можете пропустить шаги 5 и 8, но я так не пробовал):
- Загрузите источник MessagePack из https://github.com/msgpack/msgpack-java.git.
- Импортируйте источник MessagePack как проект в вашу среду IDE.
- Загрузите источник Apache Harmony для соответствующих пакетов из http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/java.
- Скопируйте эти пакеты в папку spc/main/java в MessagePack:
- java.beans
- java.beans.beancontext
- org.apache.harmony.beans
- org.apache.harmony.beans.internal.nls
- В своем проекте MessagePack удалите следующие классы:
- PropertyChangeListener
- IndexedPropertyChangeEvent
- PropertyChangeEvent
- PropertyChangeListenerProxy
- PropertyChangeSupport
- Переименуйте пакеты java.beans на что-то другое, например. custom.beans.
- Измените все ссылки java.beans на переименованный идентификатор, так что снова, например, custom.beans. Это относится к особенно для BeansFieldEntryReader (этот класс является причиной исходной ошибки).
- Измените ссылки custom.beans для пяти классов, которые вы удалили в Шаг 5, назад к java.beans.
- В классе org.apache.harmony.beans.internal.nls.Messages закомментируйте метод setLocale и удалите связанные с ним импорт.
- Удалите все классы, у которых все еще есть ошибки, кроме Encoder. В этом классе закомментируйте все ссылки на классы, которые вы удалили. Теперь у вас должен быть проект без ошибок.
- Создайте MessagePack JAR:
- Если вы используете Maven, измените версию в pom.xml на нечто уникальное, запустите Maven build с целью установки, а затем добавьте зависимость в проект Android с этой версией.
- Если вы используете не, используя Maven, вам нужно запустить цель jar для Ant с включенным build.xml. Замените JAR-приложение msgpack в своем проекте Android этим.
- Если вы публикуете свое приложение, не забудьте указать соответствующее юридическое уведомление для Apache Harmony. Это лицензия Apache, как и MessagePack.
Это должно сделать это. Используя ваш примерный код и собственный класс данных, я смог успешно упаковать и распаковать данные.
Весь ритуал переименования связан с тем, что компилятор DEX жалуется на java. * Именование пакетов.