2012-12-03 102 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