2013-10-30 4 views
0

나는 클래스 객체를 직렬화하고 싶은 안드로이드 프로젝트에서 일하고있다. 나는 이것을 수행하는 방법을 둘러 보았고 몇 가지 해결책이 있음을 알았다. 시험을 마치고 다음과 같은 솔루션 :안드로이드에서 예외 예외 직렬화

 public static byte[] toByteArray(Object obj) throws IOException { 
     byte[] bytes = null; 
     ByteArrayOutputStream bos = null; 
     ObjectOutputStream oos = null; 
     try { 
      bos = new ByteArrayOutputStream(); 
      oos = new ObjectOutputStream(bos); 
      oos.writeObject(obj); 
      oos.flush(); 
      bytes = bos.toByteArray(); 
     } finally { 
      if (oos != null) { 
      Log.i(TAG, "not null"); 
       oos.close(); 
      } 
      if (bos != null) { 
       bos.close(); 
      Log.i(TAG, "not null"); 
      } 
     } 
     return bytes; 
    } 

다음으로 내가 직렬화하기 위해 노력하고있어 개체가 정의됩니다

다음과 같이 toByteArray 방법은 온 클릭 방법이라고
  // ObjectInfo struct definition 
      public class ObjectInfo implements java.io.Serializable 
{ 
     public int ObjectXCor; 
     public int ObjectYCor; 
     public int ObjectMass; 

     //Constructor 
     public ObjectInfo(){ 
      ObjectMass = 0; 
      ObjectXCor = 0; 
      ObjectYCor = 0; 
     } 
    }; 

    // ObjectInfo struct definition 
    public class SensorDataStruct implements java.io.Serializable 
    { 
     public int PingData; 
     public int IRData; 
     public int ForceData; 
     public int CompassData; 

     //Constructor 
     public SensorDataStruct(){ 
      CompassData = 0; 
      ForceData = 0; 
      IRData = 0; 
      PingData = 0; 
     } 
    }; 

    // ObjectInfo struct definition 
    public class CommStruct implements java.io.Serializable 
    { 
      public ObjectInfo VisionData; 
      public SensorDataStruct SensorData; 

      //Constructor 
      public CommStruct(){ 
       // Call constructors 
       VisionData = new ObjectInfo(); 
       SensorData = new SensorDataStruct(); 
      } 
    }; 

:

try { 
    Log.i(TAG, "==== trying to serialize ===="); 
    communicationmoduleUDSB.toByteArray(CMUSB.SendPacket); 
} 
catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    Log.i(TAG, "Failed to serialize!"); 
} 

te onClick 메서드에 연결된 단추를 누르면 예외가 throw됩니다. 그러나 나는 왜 그런지 모르겠다. 모든 제안은 환영합니다! 여기 CommunicationModule하고 자세한 내용

10-30 12:21:15.474: I/CommunicatorApp:(12338): ==== trying to serialize ==== 
10-30 12:21:15.554: I/(12338): not null 
10-30 12:21:15.554: I/(12338): not null 
10-30 12:21:15.554: W/System.err(12338): java.io.NotSerializableException: com.example.communicationmodulebase.Server 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) 
10-30 12:21:15.564: W/System.err(12338): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 
10-30 12:21:15.574: W/System.err(12338): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 
10-30 12:21:15.574: W/System.err(12338): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
10-30 12:21:15.574: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
10-30 12:21:15.594: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
10-30 12:21:15.604: W/System.err(12338): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 
10-30 12:21:15.604: W/System.err(12338): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) 
10-30 12:21:15.604: W/System.err(12338): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 
10-30 12:21:15.604: W/System.err(12338): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 
10-30 12:21:15.614: W/System.err(12338): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
10-30 12:21:15.614: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
10-30 12:21:15.614: W/System.err(12338): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
10-30 12:21:15.614: W/System.err(12338): at com.example.communicationmoduleUSB.communicationmoduleUDSB.toByteArray(communicationmoduleUDSB.java:121) 
10-30 12:21:15.614: W/System.err(12338): at com.example.communicationmodule.MainActivity$1.onClick(MainActivity.java:41) 
10-30 12:21:15.614: W/System.err(12338): at android.view.View.performClick(View.java:4162) 
10-30 12:21:15.624: W/System.err(12338): at android.view.View$PerformClick.run(View.java:17082) 
10-30 12:21:15.624: W/System.err(12338): at android.os.Handler.handleCallback(Handler.java:615) 
10-30 12:21:15.624: W/System.err(12338): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-30 12:21:15.624: W/System.err(12338): at android.os.Looper.loop(Looper.java:137) 
10-30 12:21:15.634: W/System.err(12338): at android.app.ActivityThread.main(ActivityThread.java:4867) 
10-30 12:21:15.634: W/System.err(12338): at java.lang.reflect.Method.invokeNative(Native Method) 
10-30 12:21:15.634: W/System.err(12338): at java.lang.reflect.Method.invoke(Method.java:511) 
10-30 12:21:15.634: W/System.err(12338): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
10-30 12:21:15.644: W/System.err(12338): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
10-30 12:21:15.644: W/System.err(12338): at dalvik.system.NativeStart.main(Native Method) 
10-30 12:21:15.644: I/CommunicatorApp:(12338): Failed to serialize! 

업데이트

:

예외가 발생할 때 Catlog 프린트되어 추적 (또한, 방법 (NULL 생략)의 제 지문 추가 CommunicationModuleUSB 클래스.

CommunicatoionModule (Base class): 
package com.example.communicationmodulebaseclass; 


public class communicationmodule implements java.io.Serializable 
{ 

    // ObjectInfo struct definition 
    public class ObjectInfo implements java.io.Serializable 
{ 
     public int ObjectXCor; 
     public int ObjectYCor; 
     public int ObjectMass; 

     //Constructor 
     public ObjectInfo(){ 
      ObjectMass = 0; 
      ObjectXCor = 0; 
      ObjectYCor = 0; 
     } 
    }; 

    // ObjectInfo struct definition 
    public class SensorDataStruct implements java.io.Serializable 
{ 
     public int PingData; 
     public int IRData; 
     public int ForceData; 
     public int CompassData; 

     //Constructor 
     public SensorDataStruct(){ 
      CompassData = 0; 
      ForceData = 0; 
      IRData = 0; 
      PingData = 0; 
     } 
    }; 

    // ObjectInfo struct definition 
    public class CommStruct implements java.io.Serializable 
{ 
      public ObjectInfo VisionData; 
      public SensorDataStruct SensorData; 

      //Constructor 
      public CommStruct(){ 
       // Call constructors 
       VisionData = new ObjectInfo(); 
       SensorData = new SensorDataStruct(); 
      } 
    }; 

    public CommStruct SendPacket; 
    public CommStruct RecievePacket; 
    public ObjectInfo Test; 

    public communicationmodule(){ 

    } 

    public void SendBuffer(){ 

    } 

    public void Send(){ 

    } 

    public void RecieveBuffer(){ 

    } 

    public void Recieve(){ 

    } 
} 

그리고 CommuncationModule 클래스를 extens CommuncationModuleUSB 클래스

package com.example.communicationmoduleUSB; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutput; 
import java.io.ObjectOutputStream; 

import android.os.*; 
import android.util.Log; 

import com.example.communicationmodulebase.Server; 
import com.example.communicationmodulebaseclass.communicationmodule; 
import com.example.communicationmodulebaseclass.communicationmodule.CommStruct; 
import com.example.communicationmodulebaseclass.communicationmodule.ObjectInfo; 

public class communicationmoduleUDSB extends communicationmodule { 

    private static final String TAG = null; 
    public byte ArrayRecieved[] = new byte[2]; 
    public byte ArrayOutput[] = new byte[2]; 
    public boolean UseStructFunction = true; 


    // Create TCP server (based on MicroBridge LightWeight Server). 
    // Note: This Server runs in a separate thread. 
    Server server = null; 

    public communicationmoduleUDSB(){ 
     SendPacket = new CommStruct(); 
     RecievePacket = new CommStruct(); 
     Test = new ObjectInfo(); 

     RecievePacket.SensorData.CompassData = 0; 
     SendPacket.SensorData.CompassData = 0; 

     //SendPacket = RecievePacket; 

     // Create TCP server (based on MicroBridge LightWeight Server) 
     try 
     { 
      server = new Server(4568); //Use the same port number used in ADK Main Board firmware 
      server.start();  

     } catch (IOException e) 
     { 
      Log.e("Seeeduino ADK", "Unable to start TCP server", e); 

     } 


     server.addListener(new com.example.communicationmodulebase.AbstractServerListener() { 

      // Recieve handler example function 
      // Recieves data and sends it back 
      @Override 
      public void onReceive(com.example.communicationmodulebase.Client client, byte[] data) 
      {  

       if(UseStructFunction){ 

        // Event handler for recieving data, the size of structs  
        //if (data.length < 10){ 
        // return; 
        //} 

        // Send CommStruct 
        Send(); 

       } 
       else{ 
         // Event handler for recieving data, the size of the desired data to 
         // be recieved 
         if (data.length < 10){ 
          return; 
         } 


         //For this example convert recieved data to char array before sending back 
         String str = new String(data); //using the platform's default charset 
         char[] chars = str.toCharArray(); 

         //Send buffer function, send data back 
         SendBuffer(chars, 28); 
       } 
      } 
     }); 


    } 


    // Send buffer function 
    public void SendBuffer(char Buffer[], int Size){ 

      // Declare and init a byte array 
      byte ByteBuffer[] = new byte[Size]; 

      // Fill byte array 
      for(int i=0; i < Size; i++){ 
       ByteBuffer[i] = (byte) Buffer[i]; 
      } 

      try 
      { 
       // Send byte array 
       server.send(ByteBuffer); 

      } 
      catch (IOException e) 
      { 
       Log.e("USBCommunicator", "problem sending TCP message", e); 
      } 
    } 

     public static byte[] toByteArray(CommStruct obj) throws IOException { 
      byte[] bytes = null; 
      ByteArrayOutputStream bos = null; 
      ObjectOutputStream oos = null; 
      try { 
       bos = new ByteArrayOutputStream(); 
       oos = new ObjectOutputStream(bos); 
       oos.writeObject(obj); 
       oos.flush(); 
       bytes = bos.toByteArray(); 
      } finally { 
       if (oos != null) { 
       Log.i(TAG, "not null"); 
        oos.close(); 
       } 
       if (bos != null) { 
        bos.close(); 
       Log.i(TAG, "not null"); 
       } 
      } 
      return bytes; 
     } 

    // Send struct function 
    public void Send(){  

     try 
     {   
      // First convert the CommStruct to a byte array 
      // Then send the byte array 
      server.send(toByteArray(SendPacket)); 

     } 
     catch (IOException e) 
     { 
      Log.e("USBCommunicator", "problem sending TCP message", e); 
     } 
    } 
    } 
+0

'com.example.communicationmodulebase.Server' 클래스를 직렬화하려고합니다. 이 수업은 무엇입니까? 나는 그것을 발견 할 수 없다. – Szymon

+1

@Szymon : 의견을 보내 주셔서 감사합니다. Microbridge 경량 서버 기반의 헬퍼 클래스입니다. 그것은 실제로 잘못되었지만 어떻게 시도가 시작되었는지 모르겠습니다. public static byte [] toByteArray (Object obj)에서 public static byte [] toByteArray (Commstruct obj)로 IOException을 던져서 메소드의 defentition을 변경해야하는데, 이는 serialize하려는 객체의 유형이므로 IOException을 던집니다. – Roy08

+0

직렬화 할 수 없기 때문에'CMUSB.SendPacket'을 직렬화 할 수 없으며 소스 코드를 변경할 수있는 권한이 없다고 생각합니다. – Szymon

답변

1

CMUSB.SendPacket은 아마도 com.example.communicationmodulebase.Server 일 가능성이 큽니다. 이 유형은 직렬화 가능하지 않으므로 라인에서 예외가 발생합니다. oos.writeObject(obj);

다른 클래스를 직렬화해야합니다. 이 클래스가 무엇인지는 잘 모르겠지만이 클래스 자체의 객체가 아니라이 클래스가 보유하고있는 데이터 (클래스를 다시 만드는 데 필요한 데이터)를 직렬화하려고해야합니다.

private static final long serialVersionUID = -5003427037057257659L; 

각각 그들 고유 번호 : 측면에 참고로


는 직렬화 클래스 정의이 상수를 가져야한다. 이렇게하면 항상 직렬화 및 직렬화가 올바르게 이루어집니다. 여기에서 더 자세히 확인하십시오 : What is a serialVersionUID and why should I use it?

+1

답변 해 주신 Commstruct 클래스는 communicatorModule 클래스의 일부입니다. CommunicatorModuleUSB 클래스는 communicatormodule 클래스에서 확장됩니다. 다른 클래스의 일부일 때 Commstuct 클래스 객체를 직렬로 만드는 방법은 무엇입니까?)자세한 정보는 두 클래스의 게시물을 업데이트하겠습니다. 도와 줘서 고마워. – Roy08

+0

com.example.communicationmodulebase.Server는 CommunicationModuleUSB 클래스에 포함 된 패키지입니다. 그것 contation 서버와 클라이언트 funcitons 내가 내 자신의 기능을 사용합니다. – Roy08

+0

'CMUSB.SendPacket'의 종류는 무엇입니까? 그것은'com.example.communicationmodulebase.Server'입니까? – Szymon