以前はiPhoneベースのクライアントしかサポートしていないクライアント/サーバーアプリケーション用のAndroidクライアントを作成しようとしています。サーバーは実際に他のデバイスをサポートする意図で設計されておらず、処理できる必要があるデータの一部はNSKeyedArchiver
を使って生成されたバイトのチャンクとして保存され、iPhoneクライアントのNSDictionary
をシリアル化します。Eclipse SWT - 'id'から使用可能なタイプに変換する方法
デシリアライズを処理するには、NSKeyedArchiver
とNSKeyedUnarchiver
を含む、Cocoa API呼び出しとクラスのJavaバインディングを含むEclipse SWTを使用しようとしています。これらは動作しているようですが、NSKeyedUnarchiver.unarchiveObjectWithData()
はid
タイプを返します。これを実際にはNSDictionary
でなければなりません。 Objective-Cの簡単なキャストでObviousingすることはトリックを行うだろうが、Javaで同じことをしようとすると、実行時にClassCastException
をスロー: org.eclipse.swt:スレッド「メイン」とjava.lang.ClassCastExceptionで
例外を。 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)result;
pool.release();
}
変換 'r 「id
からもっと便利なものへのエスチュート」NSDictionary
?
Androidデバイスでこのコードを実行すると実際に動作しましたか?私が理解していたことから、SWTはJava <-> Objective Cブリッジを使用してこのコードを実行します。 – grundprinzip
@grundprinzip - いいえ、Android搭載端末では動作しません。実際、私はこのコードがMac上で正常に動作することを確信しています。それにかかわらず、私が使用している方法は、Macサーバーがアプリケーションのサーバー側データベースでSWTコードを実行することです。これは、ネイティブiOSデータ構造を処理し、それらをJSONに変換してから、JSONをデータベースに格納します。 AndroidクライアントはJSONデータをダウンロードし、すべて正常です。 – aroth
私は似たようなことをやろうとしています。私はNSKeyedArchiverに読み書きする必要があります。これを行うために取ったいくつかのステップを教えてください。 – strange