@Override
 public Short unserialize(Reader reader, int tag, Type type) throws IOException {
   if (tag >= '0' && tag <= '9') return (short) (tag - '0');
   if (tag == TagInteger) return (short) ValueReader.readInt(reader, TagSemicolon);
   switch (tag) {
     case TagLong:
       return (short) ValueReader.readLong(reader, TagSemicolon);
     case TagDouble:
       return Double.valueOf(ValueReader.readDouble(reader)).shortValue();
     case TagEmpty:
       return 0;
     case TagTrue:
       return 1;
     case TagFalse:
       return 0;
     case TagUTF8Char:
       return Short.parseShort(ValueReader.readUTF8Char(reader));
     case TagString:
       return Short.parseShort(ReferenceReader.readString(reader));
   }
   return super.unserialize(reader, tag, type);
 }
 static final Timestamp[] read(HproseReader reader, InputStream stream) throws IOException {
   int tag = stream.read();
   switch (tag) {
     case TagNull:
       return null;
     case TagList:
       {
         int count = ValueReader.readInt(stream, TagOpenbrace);
         Timestamp[] a = new Timestamp[count];
         reader.refer.set(a);
         for (int i = 0; i < count; ++i) {
           a[i] = TimestampUnserializer.read(reader, stream);
         }
         stream.read();
         return a;
       }
     case TagRef:
       return (Timestamp[]) reader.readRef(stream);
     default:
       throw ValueReader.castError(reader.tagToString(tag), Array.class);
   }
 }