我正在尝试为之前仅支持基于iPhone的客户端的客户端/服务器应用创建Android客户端。服务器实际上并不是为了支持其他设备而设计的,我需要能够处理的一些数据存储为使用NSKeyedArchiver
序列化{{1}生成的一大块字节在iPhone客户端上。
为了处理反序列化我正在尝试使用Eclipse SWT,其中包括用于Cocoa API调用和类的Java绑定,包括NSDictionary
和NSKeyedArchiver
。这些似乎有效,但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
?
答案 0 :(得分:1)
id
到SWT中可用的东西的方法是构造所需具体类型的新实例,将id
作为参数传递给构造函数。像:
NSDictionary dictionaryResult = new NSDictionary(result);
很明显,当你想到它时。