コード例 #1
0
 // write identical to other version, but take field values from hashmap (because of annoying
 // putField/getField feature)
 private void writeCompatibleObjectFields(
     Object toWrite, Map fields, FSTClazzInfo.FSTFieldInfo[] fieldInfo) throws IOException {
   int booleanMask = 0;
   int boolcount = 0;
   for (int i = 0; i < fieldInfo.length; i++) {
     try {
       FSTClazzInfo.FSTFieldInfo subInfo = fieldInfo[i];
       boolean isarr = subInfo.isArray();
       Class subInfType = subInfo.getType();
       if (subInfType != boolean.class || isarr) {
         if (boolcount > 0) {
           codec.writeFByte(booleanMask << (8 - boolcount));
           boolcount = 0;
           booleanMask = 0;
         }
       }
       if (subInfo.isIntegral() && !isarr) {
         if (subInfType == boolean.class) {
           if (boolcount == 8) {
             codec.writeFByte(booleanMask << (8 - boolcount));
             boolcount = 0;
             booleanMask = 0;
           }
           boolean booleanValue =
               ((Boolean) fields.get(subInfo.getField().getName())).booleanValue();
           booleanMask = booleanMask << 1;
           booleanMask = (booleanMask | (booleanValue ? 1 : 0));
           boolcount++;
         } else if (subInfType == int.class) {
           codec.writeFInt(((Number) fields.get(subInfo.getField().getName())).intValue());
         } else if (subInfType == long.class) {
           codec.writeFLong(((Number) fields.get(subInfo.getField().getName())).longValue());
         } else if (subInfType == byte.class) {
           codec.writeFByte(((Number) fields.get(subInfo.getField().getName())).byteValue());
         } else if (subInfType == char.class) {
           codec.writeFChar((char) ((Number) fields.get(subInfo.getField().getName())).intValue());
         } else if (subInfType == short.class) {
           codec.writeFShort(((Number) fields.get(subInfo.getField().getName())).shortValue());
         } else if (subInfType == float.class) {
           codec.writeFFloat(((Number) fields.get(subInfo.getField().getName())).floatValue());
         } else if (subInfType == double.class) {
           codec.writeFDouble(((Number) fields.get(subInfo.getField().getName())).doubleValue());
         }
       } else {
         // object
         Object subObject = fields.get(subInfo.getField().getName());
         writeObjectWithContext(subInfo, subObject);
       }
     } catch (Exception ex) {
       throw FSTUtil.rethrow(ex);
     }
   }
   if (boolcount > 0) {
     codec.writeFByte(booleanMask << (8 - boolcount));
   }
 }