I'm working on an Android project where i want to serialize a class object. I have looked around how to do this and i found out there are several solutions. The tried the following solution:
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; } The object that i'm trying to serialize is as followed defined:
// 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(); } }; The toByteArray method is called in a onClick method as followed:
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!"); } When i press the button that is attachted to te onClick method then i see that a exception is throwed. But i don't know why, does anyone have a idea? All suggestions are welcome!
The trace that is printed in the Catlog when the exception occurs (also added the first prints of the methods (not null):
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! Update
For more information here are the CommunicationModule and CommunicationModuleUSB classes.
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(){ } } And the CommuncationModuleUSB class that extens the CommuncationModule class
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); } } }
com.example.communicationmodulebase.Serverclass. What is this class? I can't find it above.CMUSB.SendPacketbecause it's not serializable and I guess you don't have access to the source code to change it.