Есть ли способ узнать, какой тип объекта находится в посылке на Android? - PullRequest
0 голосов
/ 11 октября 2019

Я создаю приложение для Android, которое отправляет объекты 2-го типа, которые реализуют интерфейс, пригодный для разделения (давайте назовем их objectA и objectB) по сети в виде байтовых массивов. Но на приемном конце мне нужно знать, какой тип объекта прибыл в посылку. Метод parcel.readValue () возвращает только Object, поэтому на принимающей стороне я не знаю, какой объект мне следует воссоздать objectA или objectB. Как это может быть сделано? Есть ли в посылках какие-то метаданные, описывающие тип исходного объекта?

Редактировать: язык Java

Редактировать: Добавлен пример кода

        ObjectA objA = new ObjectA("uid", "description");

        byte[] bytes = ParcelUtil.toBytes(objA); //this simulates the sending

        Object rebuilt = ParcelUtil.rebuildFromBytes(bytes); //here I don't know what am I rebuilding, objectA or objectB
        if(rebuilt instanceof Parcel){
            Parcel p = (Parcel) rebuilt;

            ObjectB oB = (ObjectB) p.readValue(ObjectB.class.getClassLoader());
            if(oB.getUid() == null){
                ObjectA oA = (ObjectA) p.readValue(ObjectA.class.getClassLoader()); //this will also be full of null values
            }
        }

1 Ответ

1 голос
/ 11 октября 2019

Я полагаю, у вас есть доступ к классам, которые могут быть возможными типами объекта, который вы получили. В Java вы можете просто использовать оператор instanceof, чтобы проверить, какой объект вы получили:

if (yourObject instanceof YourClass) {
  // Your code here
}

Для Parcels существует метод readValue, который принимает загрузчик классов, вызовите этот метод с помощью загрузчика классов classи это должно работать, например:

Point pointFromParcel = (Point) parcel.readValue(Point.class.getClassLoader());

https://developer.android.com/reference/android/os/Parcel#readValue(java.lang.ClassLoader)

Если вы не можете знать, каким объектом будет класс-обертка, вы можете создать класс-обертку с объектами ObjectA или ObjectB. и поле, чтобы указать, какой объект в настоящее время содержит обертка.

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