Преобразование потока байтов в объект - PullRequest
0 голосов
/ 21 июня 2011

У меня есть класс Packet (com.lab.tracking.Packet) в проекте Android.Мне нужно отправить этот пакет через UDP на сервер, который имеет точную копию этого класса пакета (com.server.serverTracking.Packet).

Приложение Android преобразует пакет в поток байтов, а затемон отправляет его на сервер.Сервер получает поток байтов правильно, но когда он пытается преобразовать его в пакет, он выдает исключение:

java.lang.ClassNotFoundException: com.lab.tracking.Packet

Я так понимаю.Сервер пытается преобразовать этот объект в com.lab.tracking.Packet вместо com.server.serverTracking.Packet).

Преобразование из байтового потока в Object:

    public static Object toObject(byte[] dataReceived) {
    Object obj = null;
    try {
        ByteArrayInputStream bis = new ByteArrayInputStream(dataReceived);
        ObjectInputStream ois = new ObjectInputStream(bis);
        obj = ois.readObject();
    } catch (IOException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {   
        ex.printStackTrace();
    }
    return obj;
}

Как этого избежать?Оба класса абсолютно одинаковы, поэтому я думаю, что проблема в полном имени (или ID, или что-то еще).

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Чтобы расширить ответ djg, проблема в том, что ваши классы Packet не "абсолютно одинаковы", потому что они находятся в разных пакетах.

Таким образом, решение состоит в том, чтобы избавиться от com.server.serverTracking.Packet и перейтиcom.lab.tracking.Packet к общей библиотеке, от которой зависит и приложение для Android, и код на стороне сервера.

При этом я бы не рекомендовал использовать сериализацию объектов Java между приложением android и сервером.Если ваш Packet изменится каким-либо существенным образом (новые переменные-члены и т. Д.) С новыми выпусками, вы, вероятно, сломаете все предыдущие версии.По крайней мере, вы должны явно указать serialVersionUid.

Лучшим решением было бы разработать структуру для байтового массива пакета и использовать фабричный класс или конструктор, который анализирует байтовый массив в Java-объект.

0 голосов
/ 21 июня 2011

Поместите реализацию пакета в основную библиотеку, от которой зависят как проект Android, так и сервер.

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