in java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractMapSerializer.java [261:328]
private Entry writeJavaChunk(
TypeResolver classResolver,
MemoryBuffer buffer,
Entry<Object, Object> entry,
Iterator<Entry<Object, Object>> iterator,
Serializer keySerializer,
Serializer valueSerializer) {
Object key = entry.getKey();
Object value = entry.getValue();
Class keyType = key.getClass();
Class valueType = value.getClass();
// place holder for chunk header and size.
buffer.writeInt16((short) -1);
int chunkSizeOffset = buffer.writerIndex() - 1;
int chunkHeader = 0;
if (keySerializer != null) {
chunkHeader |= KEY_DECL_TYPE;
} else {
keySerializer = writeKeyClassInfo(classResolver, keyType, buffer);
}
if (valueSerializer != null) {
chunkHeader |= VALUE_DECL_TYPE;
} else {
valueSerializer = writeValueClassInfo(classResolver, valueType, buffer);
}
// noinspection Duplicates
boolean keyWriteRef = keySerializer.needToWriteRef();
boolean valueWriteRef = valueSerializer.needToWriteRef();
if (keyWriteRef) {
chunkHeader |= TRACKING_KEY_REF;
}
if (valueWriteRef) {
chunkHeader |= TRACKING_VALUE_REF;
}
buffer.putByte(chunkSizeOffset - 1, (byte) chunkHeader);
RefResolver refResolver = fury.getRefResolver();
// Use int to make chunk size representable for 0~255 instead of 0~127.
int chunkSize = 0;
while (true) {
if (key == null
|| value == null
|| (key.getClass() != keyType)
|| (value.getClass() != valueType)) {
break;
}
if (!keyWriteRef || !refResolver.writeRefOrNull(buffer, key)) {
binding.write(buffer, keySerializer, key);
}
if (!valueWriteRef || !refResolver.writeRefOrNull(buffer, value)) {
binding.write(buffer, valueSerializer, value);
}
// noinspection Duplicates
++chunkSize;
if (iterator.hasNext()) {
entry = iterator.next();
key = entry.getKey();
value = entry.getValue();
} else {
entry = null;
break;
}
if (chunkSize == MAX_CHUNK_SIZE) {
break;
}
}
buffer.putByte(chunkSizeOffset, (byte) chunkSize);
return entry;
}