2011-10-19 3 views
0

以前はiPhoneベースのクライアントしかサポートしていないクライアント/サーバーアプリケーション用のAndroidクライアントを作成しようとしています。サーバーは実際に他のデバイスをサポートする意図で設計されておらず、処理できる必要があるデータの一部はNSKeyedArchiverを使って生成されたバイトのチャンクとして保存され、iPhoneクライアントのNSDictionaryをシリアル化します。Eclipse SWT - 'id'から使用可能なタイプに変換する方法

デシリアライズを処理するには、NSKeyedArchiverNSKeyedUnarchiverを含む、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

+0

Androidデバイスでこのコードを実行すると実際に動作しましたか?私が理解していたことから、SWTはJava <-> Objective Cブリッジを使用してこのコードを実行します。 – grundprinzip

+0

@grundprinzip - いいえ、Android搭載端末では動作しません。実際、私はこのコードがMac上で正常に動作することを確信しています。それにかかわらず、私が使用している方法は、Macサーバーがアプリケーションのサーバー側データベースでSWTコードを実行することです。これは、ネイティブiOSデータ構造を処理し、それらをJSONに変換してから、JSONをデータベースに格納します。 AndroidクライアントはJSONデータをダウンロードし、すべて正常です。 – aroth

+0

私は似たようなことをやろうとしています。私はNSKeyedArchiverに読み書きする必要があります。これを行うために取ったいくつかのステップを教えてください。 – strange

答えて

1

バー、私はそれを理解しました。 idからSWTで使用可能なものに到達する方法は、コンストラクタにパラメータとしてidを渡して、望ましい具体的な型の新しいインスタンスを構築することです。 Like:

NSDictionary dictionaryResult = new NSDictionary(result); 

あなたはそれについて考えても十分です。

関連する問題