#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);
Достаточно очевидно, если подумать об этом.