in src/Apache/Ignite/Data/BinaryObject.php [395:436]
private function read(BinaryCommunicator $communicator): void
{
$this->readHeader($communicator);
if ($this->hasSchema) {
$this->buffer->setPosition($this->startPos + $this->schemaOffset);
$fieldOffsets = [];
$fieldIds = $this->typeBuilder->getSchema()->getFieldIds();
$index = 0;
$schemaEndOffset = $this->startPos + $this->length;
if ($this->hasRawData) {
$schemaEndOffset -= TypeInfo::getTypeInfo(ObjectType::INTEGER)->getSize();
}
while ($this->buffer->getPosition() < $schemaEndOffset) {
if (!$this->compactFooter) {
$fieldId = $this->buffer->readInteger();
$this->typeBuilder->getSchema()->addField($fieldId);
} else {
if ($index >= count($fieldIds)) {
BinaryUtils::serializationError(
false, 'wrong number of fields in schema');
}
$fieldId = $fieldIds[$index];
$index++;
}
array_push($fieldOffsets, [$fieldId, $this->buffer->readNumber($this->offsetType, false)]);
}
usort($fieldOffsets,
function (array $val1, array $val2): int
{
return $val1[1] - $val2[1];
});
for ($i = 0; $i < count($fieldOffsets); $i++) {
$fieldId = $fieldOffsets[$i][0];
$offset = $fieldOffsets[$i][1];
$nextOffset = $i + 1 < count($fieldOffsets) ? $fieldOffsets[$i + 1][1] : $this->schemaOffset;
$field = BinaryObjectField::fromBuffer(
$communicator, $this->buffer, $this->startPos + $offset, $nextOffset - $offset, $fieldId);
$this->fields[$field->getId()] = $field;
}
}
$this->buffer->setPosition($this->startPos + $this->length);
}