// 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)); } }