Eclipse SWT - 如何从'id'转换为可用类型

时间:2011-10-19 01:30:41

标签: java objective-c ios serialization

我正在尝试为之前仅支持基于iPhone的客户端的客户端/服务器应用创建Android客户端。服务器实际上并不是为了支持其他设备而设计的,我需要能够处理的一些数据存储为使用NSKeyedArchiver序列化{{1}生成的一大块字节在iPhone客户端上。

为了处理反序列化我正在尝试使用Eclipse SWT,其中包括用于Cocoa API调用和类的Java绑定,包括NSDictionaryNSKeyedArchiver。这些似乎有效,但NSKeyedUnarchiver会返回NSKeyedUnarchiver.unarchiveObjectWithData()类型,而我无法弄清楚如何将其转换为可用的内容(实际应该是id) 。在objective-c中显而易见,一个简单的强制转换可以解决问题,但在Java中尝试相同的操作会在运行时抛出NSDictionary

  

线程“main”中的异常java.lang.ClassCastException:   org.eclipse.swt.internal.cocoa.id无法转换为   org.eclipse.swt.internal.cocoa.NSDictionary

我正在测试的代码是:

ClassCastException

那么我需要做些什么才能将“结果”从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)result; pool.release(); } 转换为更有用的内容,例如id

1 个答案:

答案 0 :(得分:1)

呸,没关系,我明白了。从id到SWT中可用的东西的方法是构造所需具体类型的新实例,将id作为参数传递给构造函数。像:

NSDictionary dictionaryResult = new NSDictionary(result);

很明显,当你想到它时。