protected Throwable tightUnmarsalThrowable(
     OpenWireFormat wireFormat, DataInput dataIn, BooleanStream bs) throws IOException {
   if (bs.readBoolean()) {
     String clazz = tightUnmarshalString(dataIn, bs);
     String message = tightUnmarshalString(dataIn, bs);
     Throwable o = createThrowable(clazz, message);
     if (wireFormat.isStackTraceEnabled()) {
       if (STACK_TRACE_ELEMENT_CONSTRUCTOR != null) {
         StackTraceElement ss[] = new StackTraceElement[dataIn.readShort()];
         for (int i = 0; i < ss.length; i++) {
           try {
             ss[i] =
                 (StackTraceElement)
                     STACK_TRACE_ELEMENT_CONSTRUCTOR.newInstance(
                         new Object[] {
                           tightUnmarshalString(dataIn, bs),
                           tightUnmarshalString(dataIn, bs),
                           tightUnmarshalString(dataIn, bs),
                           Integer.valueOf(dataIn.readInt())
                         });
           } catch (IOException e) {
             throw e;
           } catch (Throwable e) {
           }
         }
         o.setStackTrace(ss);
       } else {
         short size = dataIn.readShort();
         for (int i = 0; i < size; i++) {
           tightUnmarshalString(dataIn, bs);
           tightUnmarshalString(dataIn, bs);
           tightUnmarshalString(dataIn, bs);
           dataIn.readInt();
         }
       }
       o.initCause(tightUnmarsalThrowable(wireFormat, dataIn, bs));
     }
     return o;
   } else {
     return null;
   }
 }