Eclipse SWT — Как преобразовать из ‘id’ в полезный тип

#java #objective-c #ios #serialization

#java #objective-c #iOS #сериализация

Вопрос:

Я пытаюсь создать клиент Android для клиент-серверного приложения, которое ранее поддерживало только клиенты на базе iPhone. Сервер на самом деле не был разработан с целью поддержки других устройств, и некоторые данные, которые мне нужны для обработки, хранятся в виде фрагмента байтов, который был сгенерирован с помощью an NSKeyedArchiver для сериализации NSDictionary на клиенте iPhone.

Для обработки десериализации я пытаюсь использовать Eclipse SWT, который включает в себя привязки Java для вызовов и классов API Cocoa, включая NSKeyedArchiver and NSKeyedUnarchiver . Кажется, они работают, но NSKeyedUnarchiver.unarchiveObjectWithData() возвращают id тип, и я не смог понять, как преобразовать его во что-то полезное (на самом деле это должно быть an NSDictionary ). Устранение в objective-c простого приведения помогло бы, но попытка сделать то же самое в Java выдает ClassCastException во время выполнения:

Исключение в потоке «main» java.lang.ClassCastException: org.eclipse.swt.internal.cocoa.id не может быть приведен к org.eclipse.swt.internal.cocoa.NSDictionary

Код, с которым я тестирую:

 public static void main(String[] args) throws Exception {
    NSAutoreleasePool pool = (NSAutoreleasePool)new NSAutoreleasePool().alloc().init();

    //read the test data into a byte array
    int read = 0;
    byte[] buffer = new byte[1024];
    FileInputStream in = new FileInputStream(INPUT);
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    while((read = in.read(buffer)) != -1) {
        bytes.write(buffer, 0, read);
    }
    buffer = bytes.toByteArray();

    System.out.println("Read "   buffer.length   " bytes");

    //load the byte array into an NSData instance
    NSData data = NSData.dataWithBytes(buffer, buffer.length);

    //deserialize the data              
    id result = NSKeyedUnarchiver.unarchiveObjectWithData(data);

    //error here
    NSDictionary dictionaryResult = (NSDictionary)resu<

    pool.release();
}
  

Итак, что мне нужно сделать, чтобы преобразовать ‘result’ из id во что-то более полезное, например NSDictionary ?

Комментарии:

1. Действительно ли это работало при выполнении этого кода на устройстве Android? Насколько я понял, SWT использует мост Java<->Objective C для выполнения этого кода.

2. @grundprinzip — Нет, это не будет работать на устройстве Android. На самом деле, я почти уверен, что этот код будет правильно работать только на Mac. Независимо от того, как я его использую, сервер Mac запускает код SWT в базе данных приложения на стороне сервера. Он обрабатывает структуры данных native-iOS, преобразует их в JSON, а затем сохраняет JSON в базе данных. Клиент Android загружает данные JSON, и все хорошо.

3. Я пытаюсь сделать что-то подобное, мне нужно читать и записывать в NSKeyedArchiver, пожалуйста, не могли бы вы предоставить мне несколько шагов, которые вы предприняли, чтобы это сделать?

Ответ №1:

Бах, неважно, я понял это. Способ получить от id к чему-то полезному в SWT — это создать новый экземпляр желаемого конкретного типа, передав его в id качестве параметра конструктору. Нравится:

 NSDictionary dictionaryResult = new NSDictionary(result);
  

Достаточно очевидно, если подумать об этом.