0

最近、ゲームにネットワーキングを追加し始めましたが、このような経験は初めてです。

私はこの Slick API を使用してグラフィックスを処理し (とりわけ)、ObjectInputSteams と ObjectOutputStreams を使用してネットワーキングを行っています。

サーバー経由で画像を送信して接続をテストすることにしましたが、画像に対して NotSerializableException が発生しました。

    java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:     org.newdawn.slick.Image
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at inGame.ConnectClient.alwaysGet(ConnectClient.java:50)
at inGame.ConnectClient.setUp(ConnectClient.java:26)
at inGame.ConnectClient.run(ConnectClient.java:34)
at java.lang.Thread.run(Thread.java:680)
    Caused by: java.io.NotSerializableException: org.newdawn.slick.Image
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at inGame.ConnectServer.write(ConnectServer.java:40)
at scenes.HostMenu.update(HostMenu.java:47)
at org.newdawn.slick.state.StateBasedGame.update(StateBasedGame.java:268)
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:657)
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:408)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:318)
at scenes.Head.main(Head.java:47)

オブジェクトをシリアライズ可能にするにはどうすればよいですか? それとも、このすべてで完全に間違った方向に進んでいますか?

どんな入力でも大歓迎です!

ありがとう!

4

2 に答える 2

0

ObjectInputStream / ObjectOutputStreamオブジェクトをリモートクライアントに送信するために使用しています。この方法で送信できるのは、シリアライズjava.io.Serializable可能なオブジェクトのみで、それらはインターフェイスを実装し、すべての非一時的なフィールドはプリミティブ値または実装java.io.Serializableです。

最初の解決策: すべてのオブジェクトをシリアライズ可能にします。ただし、シリアル化できないサードパーティ製のオブジェクトを使用する場合、これは機能しません。

2 番目の解決策: java-build-in の他のシリアライゼーションを使用します。たとえば、非常に堅牢な Java シリアライゼーション/デシリアライゼーション ライブラリであるXStreamを使用できます。

3 番目の解決策: XML シリアライゼーションは、画像などのバイナリ データを送信する最良の方法ではありません。その場合、シリアライゼーションとデシリアライゼーション自体を処理する必要があります。単純な出力/入力ストリームを開き、そこにバイナリ データを書き込み/読み取ります。

于 2013-01-27T15:10:47.337 に答える
0

サードパーティ クラスを Serializable にする簡単な方法の 1 つは、Image クラスを拡張し、java.io.Serializable インターフェイスを実装する独自のクラスを作成することです (コンストラクタのすべてのバージョンを準備し、それらを基本クラスのコンストラクタに委譲することを忘れないでください)。

ただし、Slick の Image クラスは、正当な理由でシリアル化できない場合があります。低レベルのオペレーティングシステム関連のものが含まれている場合、それをシリアル化してサーバーに送信し、そこで開くことができない場合があります。画像名をサーバーに送信してサーバー上のファイルからロードするなどの単純なソリューションの方が信頼性が高いでしょうか?

于 2013-01-27T15:13:14.893 に答える