In both client and server classes, I have an exact same inner class called Data. This Data object is being sent from the server using:
ObjectOutputStream out
What you were trying to do is something along the lines of the following:
class TCPServer {
/* some code */
class Data {
}
}
class TCPClient {
/* some code */
class Data {
}
}
Then you are serializing a TCPServer$Data and trying to unserialize it as a TCPClient$Data. Instead you are going to want to be doing this:
class TCPServer {
/* some code */
}
class TCPClient {
/* some code */
}
class Data {
/* some code */
}
Then make sure the Data class is available to both the client and the server programs.
When you use some class in two different JVMs, and you are marshalling/unmarshalling the class then the class should be exported to a common library and shared between both server and client. Having different class wont work any time.
What you are trying to do is marshall TCPServer$Data and unmarshall as TCPClient$Data. That is incompatible.