void write()

in modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java [614:918]


    void write(Object obj, BinaryWriterExImpl writer) throws BinaryObjectException {
        try {
            assert obj != null;
            assert writer != null;
            assert mode != BinaryWriteMode.OPTIMIZED : "OptimizedMarshaller should not be used here: " + cls.getName();

            writer.typeId(typeId);

            switch (mode) {
                case P_BYTE:
                case BYTE:
                    writer.writeByteFieldPrimitive((byte)obj);

                    break;

                case P_SHORT:
                case SHORT:
                    writer.writeShortFieldPrimitive((short)obj);

                    break;

                case P_INT:
                case INT:
                    writer.writeIntFieldPrimitive((int)obj);

                    break;

                case P_LONG:
                case LONG:
                    writer.writeLongFieldPrimitive((long)obj);

                    break;

                case P_FLOAT:
                case FLOAT:
                    writer.writeFloatFieldPrimitive((float)obj);

                    break;

                case P_DOUBLE:
                case DOUBLE:
                    writer.writeDoubleFieldPrimitive((double)obj);

                    break;

                case P_CHAR:
                case CHAR:
                    writer.writeCharFieldPrimitive((char)obj);

                    break;

                case P_BOOLEAN:
                case BOOLEAN:
                    writer.writeBooleanFieldPrimitive((boolean)obj);

                    break;

                case DECIMAL:
                    writer.writeDecimal((BigDecimal)obj);

                    break;

                case STRING:
                    writer.writeString((String)obj);

                    break;

                case UUID:
                    writer.writeUuid((UUID)obj);

                    break;

                case DATE:
                    writer.writeDate((Date)obj);

                    break;

                case TIMESTAMP:
                    writer.writeTimestamp((Timestamp)obj);

                    break;

                case TIME:
                    writer.writeTime((Time)obj);

                    break;

                case BYTE_ARR:
                    writer.writeByteArray((byte[])obj);

                    break;

                case SHORT_ARR:
                    writer.writeShortArray((short[])obj);

                    break;

                case INT_ARR:
                    writer.writeIntArray((int[])obj);

                    break;

                case LONG_ARR:
                    writer.writeLongArray((long[])obj);

                    break;

                case FLOAT_ARR:
                    writer.writeFloatArray((float[])obj);

                    break;

                case DOUBLE_ARR:
                    writer.writeDoubleArray((double[])obj);

                    break;

                case CHAR_ARR:
                    writer.writeCharArray((char[])obj);

                    break;

                case BOOLEAN_ARR:
                    writer.writeBooleanArray((boolean[])obj);

                    break;

                case DECIMAL_ARR:
                    writer.writeDecimalArray((BigDecimal[])obj);

                    break;

                case STRING_ARR:
                    writer.writeStringArray((String[])obj);

                    break;

                case UUID_ARR:
                    writer.writeUuidArray((UUID[])obj);

                    break;

                case DATE_ARR:
                    writer.writeDateArray((Date[])obj);

                    break;

                case TIMESTAMP_ARR:
                    writer.writeTimestampArray((Timestamp[])obj);

                    break;

                case TIME_ARR:
                    writer.writeTimeArray((Time[])obj);

                    break;

                case OBJECT_ARR:
                    if (BinaryUtils.isBinaryArray(obj))
                        writer.writeBinaryArray(((BinaryArray)obj));
                    else
                        writer.writeObjectArray((Object[])obj);

                    break;

                case COL:
                    writer.writeCollection((Collection<?>)obj);

                    break;

                case MAP:
                    writer.writeMap((Map<?, ?>)obj);

                    break;

                case ENUM:
                    writer.writeEnum((Enum<?>)obj);

                    break;

                case BINARY_ENUM:
                    writer.writeBinaryEnum((BinaryEnumObjectImpl)obj);

                    break;

                case ENUM_ARR:
                    if (BinaryUtils.isBinaryArray(obj))
                        writer.writeBinaryArray(((BinaryArray)obj));
                    else
                        writer.doWriteEnumArray((Object[])obj);

                    break;

                case CLASS:
                    writer.writeClass((Class)obj);

                    break;

                case PROXY:
                    writer.writeProxy((Proxy)obj, intfs);

                    break;

                case BINARY_OBJ:
                    writer.writeBinaryObject((BinaryObjectImpl)obj);

                    break;

                case BINARY:
                    if (preWrite(writer, obj)) {
                        try {
                            if (serializer != null)
                                serializer.writeBinary(obj, writer);
                            else
                                ((Binarylizable)obj).writeBinary(writer);

                            postWrite(writer);

                            // Check whether we need to update metadata.
                            // The reason for this check is described in https://issues.apache.org/jira/browse/IGNITE-7138.
                            if (obj.getClass() != BinaryMetadata.class && obj.getClass() != BinaryTreeMap.class) {
                                int schemaId = writer.schemaId();

                                if (schemaReg.schema(schemaId) == null) {
                                    // This is new schema, let's update metadata.
                                    BinaryMetadataCollector collector =
                                        new BinaryMetadataCollector(typeId, typeName, mapper);

                                    if (serializer != null)
                                        serializer.writeBinary(obj, collector);
                                    else
                                        ((Binarylizable)obj).writeBinary(collector);

                                    BinarySchema newSchema = collector.schema();

                                    schemaReg.addSchema(newSchema.schemaId(), newSchema);

                                    if (userType) {
                                        BinaryMetadata meta = new BinaryMetadata(typeId, typeName, collector.meta(),
                                            affKeyFieldName, Collections.singleton(newSchema), false, null);

                                        ctx.updateMetadata(typeId, meta, writer.failIfUnregistered());
                                    }
                                }
                            }

                            postWriteHashCode(writer, obj);
                        }
                        finally {
                            writer.popSchema();
                        }
                    }

                    break;

                case OBJECT:
                    if (userType && !stableSchemaPublished) {
                        // Update meta before write object with new schema
                        BinaryMetadata meta = new BinaryMetadata(typeId, typeName, stableFieldsMeta,
                            affKeyFieldName, Collections.singleton(stableSchema), false, null);

                        ctx.updateMetadata(typeId, meta, writer.failIfUnregistered());

                        schemaReg.addSchema(stableSchema.schemaId(), stableSchema);

                        stableSchemaPublished = true;
                    }

                    if (preWrite(writer, obj)) {
                        try {
                            for (BinaryFieldAccessor info : fields)
                                info.write(obj, writer);

                            writer.schemaId(stableSchema.schemaId());

                            postWrite(writer);
                            postWriteHashCode(writer, obj);
                        }
                        finally {
                            writer.popSchema();
                        }
                    }

                    break;

                default:
                    assert false : "Invalid mode: " + mode;
            }
        }
        catch (UnregisteredBinaryTypeException | UnregisteredClassException e) {
            throw e;
        }
        catch (Exception e) {
            String msg;

            if (S.includeSensitive() && !F.isEmpty(typeName))
                msg = "Failed to serialize object [typeName=" + typeName + ']';
            else
                msg = "Failed to serialize object [typeId=" + typeId + ']';

            U.error(ctx.log(), msg, e);

            throw new BinaryObjectException(msg, e);
        }
    }