Saturday, 25 August 2012

Understanding java.io.StreamCorruptedException: invalid type code: AC

We can transport Objects in Java in two ways

  1. Using Serialization 
  2. Using RMI ( Remote Method Invocation ) 
last night i was using 1st approach to transport Objects from my server to client, while doing so my code throws 
java.io.StreamCorruptedException: invalid type code: AC

Lets see first what Javadoc has to say about this 
StreamCorruptedException :-  Thrown when control information that was read from an object stream violates internal consistency checks.
 Do you understand any thing ???

No ???

Then, continue reading ...

 So lets look at this exception closely 


This exception (java.io.StreamCorruptedException: invalid type code: AC) only occurs when any one use's a new ObjectOutputStream to write to an existing ObjectInputStream that you have already used a prior ObjectOutputStream to write to. These streams have headers which are written and read by the respective constructors, so if you start another ObjectOutputStream you will write a new header, which starts with - guess what? - 0xAC, and the existing ObjectInputStream isn't expecting another header at this point so it barfs.

So now I guess you have enough understanding about this Exception and next time you will not commit this mistake, and hence this will escape you from wasting enormous amount of time figuring out why this exception is thrown

So the bottom line is

  1. Always use only one ObjectOutputStream & corresponding ObjectInputStream through out the life of Socket
  2. If you are writing data over Socket using ObjectOutputStream then read that data only using  ObjectInputStream otherwise Exception could be thrown
  3. If you want to forget about what you have written then do 
    objectOutputStream.reset();