// incoming array is already registered
 protected void writeArray(FSTClazzInfo.FSTFieldInfo referencee, Object array) throws IOException {
   if (array == null) {
     codec.writeClass(Object.class);
     codec.writeFInt(-1);
     return;
   }
   final int len = Array.getLength(array);
   Class<?> componentType = array.getClass().getComponentType();
   codec.writeClass(array.getClass());
   codec.writeFInt(len);
   if (!componentType.isArray()) {
     if (codec.isPrimitiveArray(array, componentType)) {
       codec.writePrimitiveArray(array, 0, len);
     } else { // objects
       Object arr[] = (Object[]) array;
       for (int i = 0; i < len; i++) {
         Object toWrite = arr[i];
         writeObjectWithContext(referencee, toWrite);
       }
     }
   } else { // multidim array. FIXME shared refs to subarrays are not tested !!!
     Object[] arr = (Object[]) array;
     FSTClazzInfo.FSTFieldInfo ref1 =
         new FSTClazzInfo.FSTFieldInfo(
             referencee.getPossibleClasses(),
             null,
             conf.getCLInfoRegistry().isIgnoreAnnotations());
     for (int i = 0; i < len; i++) {
       Object subArr = arr[i];
       boolean needsWrite = true;
       if (codec.isTagMultiDimSubArrays()) {
         if (subArr == null) {
           needsWrite = !codec.writeTag(NULL, null, 0, null);
         } else {
           needsWrite = !codec.writeTag(ARRAY, subArr, 0, subArr);
         }
       }
       if (needsWrite) writeArray(ref1, subArr);
     }
   }
 }
 @Override
 public void writeChars(String s) throws IOException {
   char[] chars = s.toCharArray();
   codec.writePrimitiveArray(chars, 0, chars.length);
 }
 @Override
 public void write(byte[] b, int off, int len) throws IOException {
   codec.writePrimitiveArray(b, off, len);
 }
 @Override
 public void writeBytes(String s) throws IOException {
   byte[] bytes = s.getBytes();
   codec.writePrimitiveArray(bytes, 0, bytes.length);
 }
 @Override
 public void write(byte[] b) throws IOException {
   codec.writePrimitiveArray(b, 0, b.length);
 }