1

ソケットを介してサーバーからクライアントにオブジェクトを渡したい。クライアント側は Android です。

私はこのシリアライズ可能なクラスを持っています:

public class BoardImage implements Serializable{

    private static final long serialVersionUID = 1L;

    private String filename;
    private int boardNumber;
    private int fileSizeInBytes = -1;
    private byte imageData[];

    public BoardImage(){}

    public BoardImage(String filename) {
        this.filename = filename;

        try{
            this.boardNumber = Integer.parseInt(filename.substring(0, filename.indexOf("."))); // takes the filename without extension and converts to int
        }
        catch (NumberFormatException exp){
            this.boardNumber = -1;
        }

        FileInputStream fin = null;
        try {
            File file = new File(filename);
            fin = new FileInputStream(file);
            this.fileSizeInBytes = (int)file.length();
            imageData = new byte[fileSizeInBytes];
            fin.read(imageData); // read file data into byte array
            fin.close();

        } catch (FileNotFoundException ex) {
            Logger.getLogger(BoardImage.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(BoardImage.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

サーバー側:

            BoardImage bImg = new BoardImage(fileToSend);
            ObjectOutputStream os = new ObjectOutputStream(connection.getOutputStream());
            os.writeObject(bImg);
            os.close();

クライアント側 (Android):

    try {
        if (read == true){ // try to read from socket stream
            rcvdBoard = (BoardImage)ois.readObject(); // <-- HERE WE GET THE EXCEPTION
            System.out.println(rcvdBoard.getFileSize()); // print the size of the file

            new Thread(){
                public void run(){
                    myParant.addBoard(BitmapFactory.decodeByteArray(rcvdBoard.getFileContent(), 0, rcvdBoard.getFileSize()));
                }   
            }.start();                  

        }
    } catch (OptionalDataException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

行: rcvdBoard = (BoardImage)ois.readObject();java.io.OptionalDataException

ログキャット:

04-03 17:47:49.621: W/System.err(3910): java.io.OptionalDataException
04-03 17:47:49.621: W/System.err(3910):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:810)
04-03 17:47:49.621: W/System.err(3910):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
04-03 17:47:49.631: W/System.err(3910):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
04-03 17:47:49.631: W/System.err(3910):     at com.example.helloworld.ImageListener.run(ImageListener.java:69)

注意: Android 以外の環境でクライアント側を実行してみましたが、動作します。だから多分それはアンドロイドに関するものですか?

ありがとう!

4

1 に答える 1