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