public static void writeClassAndObject(ByteBuffer buffer, Object object) throws IOException {
        if (object == null) {
            buffer.putShort((short)-1);
            return;
        }
        SerializerRegistration reg = writeClass(buffer, object.getClass());
        
        // If the caller (or us) has registered a generic base class (like Enum)
        // that is meant to steer automatic resolution for things like FieldSerializer
        // that have final classes in fields... then there are cases where the exact 
        // type isn't known by the outer class.  (Think of a message object
        // that has an Object field but tries to send an Enum subclass in it.)
        // In that case, the SerializerRegistration object we get back isn't
        // really going to be capable of recreating the object on the other
        // end because it won't know what class to use.  This only comes up
        // in writeClassAndObject() because we just wrote an ID to a more generic
        // class than will be readable on the other end.  The check is simple, though.
        if( reg.getType() != object.getClass() ) {
            throw new IllegalArgumentException("Class has not been registered:" 
                    + object.getClass() + " but resolved to generic serializer for:" + reg.getType());
        } 

        reg.getSerializer().writeObject(buffer, object);
    }
Write the class and object.

@param buffer The buffer to write to.
@param object The object to write.
@throws IOException If serializing fails.
jme3-networking/src/main/java/com/jme3/network/serializing/Serializer.java