2012-12-03 101 views
0

我在從我的Android應用程序向我的Java應用程序發送對象時遇到了一些麻煩。 我有一個完全相同的可序列化類。Android序列化 - java反序列化

它完美,當我從一個Java的機應用發送的對象使用在接收端的代碼另一個問題:

@Override 
public void run() { 
    super.run(); 
    while(true){ 
     try{ 
      if(datagramSocket!=null)datagramSocket.close(); 
      datagramSocket = new DatagramSocket(PORT); 
      buffer = new byte[4096]; 
      inPacket = new DatagramPacket(buffer, buffer.length); 
      datagramSocket.receive(inPacket); 

      InetAddress clientAddress = inPacket.getAddress(); 
      int clientPort = inPacket.getPort(); 

      ByteArrayInputStream bais = new ByteArrayInputStream(buffer); 
      ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(bais)); 
      Song song = (Song) ois.readObject(); 
      song.setClientIP(inPacket.getAddress()); 
      dc.addSong(song); 
      datagramSocket.close(); 

     }catch (IOException e) { 
      System.out.println("IOException on receiving song: " + e); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

但是當我嘗試做同樣的機器人(所以發送曲 - 從對象的Android對Java)我得到一個ClassCastException:

[Lcom.audiobuddy.serializables.Song; cannot be cast to com.audiobuddy.serializables.Song 

首先,我認爲這是因爲包的名字是不同的,所以我改成了兩邊「com.audiobuddy.serializables」。但我看着我的錯誤,Android應用程序,更改了軟件包,在前面添加了「[L」和「;」在後面...

兩側的松類具有相同的serialVersionUID

回答

2

該錯誤消息說,你嘗試投宋[]([L(...)Song指宋數組)到樂曲。

你或許應該是這樣的更改ois.readObject();直插:

Song[] songs = (Song[]) ois.readObject(); 
Song song = songs[0]; 
+0

感謝那些工作,但......現在我得到了同樣的問題,當我試圖從Java發送到Java。我需要能夠將它從java和android發送到java應用程序 – dumazy

+1

@dumazy只要確保您要麼總是序列化一首歌曲,要麼總是序列化一個歌曲數組。現在,您可能會使用Java序列化單個歌曲,但是您會在Android代碼中序列化一組歌曲。 –

+0

我讓我的java發送者發送一個數組而不是一個單獨的對象,它完美的工作,謝謝! – dumazy