public void writeSpaceId(SpaceId spaceId) throws IOException {
   currentObject = Space.getInstance().read(spaceId);
   // Serialize the spaceId...
   process(spaceId, null, false);
   // ...and the content of the spaceObject.
   process(currentObject, null, false);
 }
  public boolean process(Object object, ClassInfo classInfo, boolean isSpaceIdAllowed)
      throws IOException {
    if (object == null) {
      return false;
    }
    Class<?> serializableClass = marshaller.getSerializableClass(object);
    SerializeContext serializeContext = marshaller.getSerializeContext();
    Converter converter = serializeContext.getConverter(serializableClass);

    // Substitute the object with its spaceId whenever possible.
    if ((object != currentObject) && (Converter.isReferable(serializableClass))) {
      // If the object is registered in the Space...
      SpaceId spaceId = Space.getInstance().getId(object);
      if (spaceId != null) {
        // ...and if substituting it with its SpaceId is allowed...
        if ((isSpaceIdAllowed) || (marshaller.isRegisteredToBeSerialized(spaceId))) {
          // ...then serialize the spaceId instead.
          object = spaceId;
          serializableClass = SpaceId.class;
          converter = serializeContext.getConverter(serializableClass);
        }
      }
    }

    Token token = converter.getToken();
    // If the token is not a CLASS or SPACE_ID...
    if ((token != Token.CLASS) && (token != Token.SPACE_ID)) {
      // ...then explicitly write the class name.
      // However, this is not required if serializableClass equals ClassInfo's class.
      // Note: serializableClass always represents a class that derives from class Object, so it
      // cannot
      // represent a primitive type. (Primitives don't have a super class, remember?) So if
      // ClassInfo.class is
      // a primitive type, it will always differ from serializableClass. In that case writing the
      // class name
      // must be skipped too.
      if ((classInfo == null)
          || ((!serializableClass.equals(classInfo.getType())
              && (!classInfo.getType().isPrimitive())))) {
        process(serializableClass, classInfo, false);
      }
    }

    if (object == currentObject) {
      currentObject = false;
    }

    writer.beginToken(token);
    boolean hasSerializedData =
        converter.serialize(object, serializableClass, classInfo, this, writer);
    writer.endToken(token);
    return hasSerializedData;
  }