2013-04-03 42 views
1

我想通過套接字將對象從服務器傳遞到客戶端。客戶端在Android上。嘗試通過套接字接收對象時的OptionalDataException

我有這樣的序列化類:

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(); 

在客戶端(安卓):

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

logcat的:

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環境中運行的客戶端和它的作品。所以也許這是關於android的東西?

謝謝!

+0

如果它沒有Android,它必須是Android的錯誤。 – EJP

+0

是的,這是合理的。但仍然沒有幫助:( – etaiso

回答

0

UPDATE: 我發現兩個BoardImage.java的包名都應該是一樣的!

+0

當然他們應該不同的包中的類是不同的,不管它們的類名是什麼) – EJP

+0

是的,但是這是兩個不同的項目,我不知道它的序列化它的包名也 – etaiso

+0

嘿@EJP那麼有兩種不同的封裝可以實現序列化和反序列化? – Vishnu

相關問題