2016-07-30 8 views
1

シリアライズを使用してサーバーからクライアントにShapeの配列を送信するクライアントとサーバーがあります。私はすべてのコードを書いており、クライアントプログラムとサーバープログラムの間で共有パッケージを作成する限り、エラーはありません。しかし、私は2つの別々のプロジェクトを作成し、それぞれの場合、私はShape.javaと同じ内容のプロジェクトを作成しますが、今度はクライアントをサーバーに接続すると、ClassNotFoundExceptionとなります。 私はShape.javaを共有パッケージに入れても、それをコピーしてサーバーのプログラムに貼り付けるとすぐにClassNotFoundExceptionというメッセージが表示されるのはなぜですか?私は自分のコードを友達に送信したいので、本当に必要です。このシリアライズされたオブジェクトを使って別のプロジェクトがあります。共有パッケージにクラス直列化の定義を入れないと、なぜClassNotFoundExceptionが生成されますか?

+0

おそらく同じパッケージ内に作成していないからです。 –

+0

ええ、それは私がなぜShapeの定義をターゲットプロジェクトに入れても、同じパッケージで作成しなければならないのですか? –

+0

'foo.bar.baz.Shape'と同じパッケージです。 –

答えて

1

同じパッケージに[クラス]を作成する理由は何ですか?

Shapeないクラスの名前、それの一部でしかありませんので。 Javaは、パッケージを含むフルネームでクラスを識別します。

サーバでcom.myserver.Shapeと定義し、クライアントでcom.myclient.Shapeと定義した場合、JVMは2つのクラスを無関係として正しく扱います。

一般的なアプローチは、データ交換オブジェクト用の特別なパッケージを作成することです。 com.shared.dto.Shapeを使用し、通信の両側で使用します。

あなたのプロジェクトを他の人と共有する必要がある場合は、DTOと別のjarファイルを作成し、クライアントライブラリと別のjarファイルを作成します。クライアントライブラリとDTO jarを使用してクライアントコードをビルドします。これにより、クライアントが同じDTO jarに対して構築されたサーバーと通信できるようになります。

+0

ノートのためにありがとう、彼は私のようなものに彼のパッケージの名前を作る場合、エラーが修正されるか? –

+0

@ehsanはい、両側で同じパッケージ名を使用すると、エラーは修正されます。しかし、同じファイルを使用して片面を修正することによって発生する問題を回避することは、より良いことです。クラスのシリアル化バージョンIDも指定することをお勧めします。 – dasblinkenlight

+0

ありがとう、私は 'private static final long serialVersionUID = 20L;'を追加して、私の投票は私がupvote多くのようにロックされている; –

関連する問題