2011-06-21 13 views
0

私はAndroidプロジェクトにPacketクラス(com.lab.tracking.Packet)を持っています。このパケットをUDP経由でサーバに送信する必要があります。サーバにはそのパケットクラス(com.server.serverTracking.Packet)のコピーがあります。バイトストリームをオブジェクトに変換する

アンドロイドアプリはパケットをバイトストリームに変換し、それをサーバーに送信します。サーバーは正しくバイトストリームを受け取り、それはパケットに変換しようとすると、それが例外をスロー:

java.lang.ClassNotFoundException: com.lab.tracking.Packet 

私はそれを理解しています。サーバーはこのオブジェクトをcom.server.serverTracking.Packetの代わりにcom.lab.tracking.Packetに変換しようとしています。

オブジェクトにバイトストリームからの変換は、次のとおりです。

public static Object toObject(byte[] dataReceived) { 
    Object obj = null; 
    try { 
     ByteArrayInputStream bis = new ByteArrayInputStream(dataReceived); 
     ObjectInputStream ois = new ObjectInputStream(bis); 
     obj = ois.readObject(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 
    return obj; 
} 

私はこれを避けることができますか?両方のクラスはまったく同じなので、問題は完全な名前(またはIDなど)にあると思います。

ありがとうございます!

+0

なぜ、まったく同じだが異なるパッケージの2つのクラスはありますか?一方を他方に単に変換する方法はありません。クライアントとサーバーが共通のPacketクラスを共有するように、コードをリファクタリングする必要があります。 – wolfcastle

答えて

1

djgの答えを拡張すると、パケットクラスが異なるパッケージになっているため、パケットクラスが「まったく同じ」ではないという問題があります。

解決策は、com.server.serverTracking.Packetを取り除き、com.lab.tracking.Packetをアンドロイドアプリとサーバーサイドコードの両方が依存する共通ライブラリに移動することです。

つまり、android appとサーバーの間でJavaオブジェクトの直列化を使用することをお勧めします。 Packetが新しいリリースでどんな重要な方法(新しいメンバー変数など)で変更されたとしても、以前のすべてのバージョンを破損する可能性があります。少なくとも、serialVersionUidを明示的に指定する必要があります。

より良い解決策は、パケットバイト配列の構造を設計し、バイト配列を解析してJavaオブジェクトにするファクトリクラスまたはコンストラクタを使用することです。

0

アンドロイドプロジェクトとサーバーの両方が依存するコアライブラリにパケット実装を配置します。

関連する問題