(Надеюсь) ФИНАЛЬНОЕ ОБНОВЛЕНИЕ
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");
из-за этой ошибки .
Если вы хотите увидеть простой пример, вот пара проектов, созданных для этой цели:
Предыдущие версии
ОБНОВЛЕНИЕ: начиная с 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 таким же образом, как в случае основного JAR-файла MessagePack (см. Шаг 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.
- Скопируйте эти пакеты в папку src / 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 и удалите связанный с ним импорт.
- Удалите все классы, в которых все еще есть ошибки, , кроме Кодер . В этом классе закомментируйте все ссылки на классы, которые вы удалили. Теперь у вас должен быть безошибочный проект.
- Создайте JAR-файл MessagePack:
- Если вы используете Maven, измените версию в pom.xml на что-то уникальное, запустите сборку Maven с целью install , затем добавьте зависимость в свой проект Android с этой версией .
- Если вы не используете Maven, вам нужно выполнить цель jar для Ant с включенным build.xml . Замените JAR-файл msgpack в вашем проекте Android на этот.
- Если вы публикуете свое приложение, не забудьте включить соответствующее юридическое уведомление для Apache Harmony. Это лицензия Apache, как и MessagePack.
Это должно сделать это. Используя ваш пример кода и мой собственный класс данных, я смог успешно упаковать и распаковать данные.
Весь ритуал переименования связан с тем, что компилятор DEX жалуется на java. * Именование пакетов.