public void Read(byte *objectAddress, SerializerInput input) { var fieldCount = input.ReadByte(); var size = fieldCount * 5; input.Skip(size); //we just skipped the required data so we have it in the buffer var buffer = input.Buffer; var offset = input.PositionInBuffer - size; var fieldDatas = _fields; if (SameHeader(buffer, offset, size)) { for (int i = 0; i < fieldCount; i++) { var fieldData = fieldDatas[i]; var fieldDataOffset = objectAddress + fieldData.Offset; var dataSerializer = fieldData.SerializationMethods; dataSerializer.Read(fieldDataOffset, input); } } else { int position = offset; var indexes = stackalloc byte[fieldCount]; var dataTypes = stackalloc DataType[fieldCount]; var fieldsLength = fieldDatas.Length; int searchStart = 0; for (var i = 0; i < fieldCount; i++) { dataTypes[i] = 0; var field = buffer[position++] | buffer[position++] << 8 | buffer[position++] << 16 | buffer[position++] << 24; var type = (DataType)buffer[position++]; var deserialized = false; for (var searchIndex = searchStart; searchIndex < fieldsLength; searchIndex++) { var fieldData = fieldDatas[searchIndex]; if (field == fieldData.FieldNameHash) { var dataSerializer = fieldData.SerializationMethods; if (type == dataSerializer.GetDataType()) { indexes[i] = (byte)searchIndex; deserialized = true; } searchStart = searchIndex + 1; break; } } if (deserialized == false) { if (FieldData.GetAlternate(fieldDatas, type, field, out var alternateIndex)) { indexes[i] = (byte)alternateIndex; } else { dataTypes[i] = type; } } } for (var i = 0; i < fieldCount; i++) { var index = indexes[i]; if ((byte)dataTypes[i] != 0) { _dataTypesDatabase.SkipData(dataTypes[i], input); continue; } var fieldData = fieldDatas[index]; var fieldDataOffset = objectAddress + fieldData.Offset; var dataSerializer = fieldData.SerializationMethods; dataSerializer.Read(fieldDataOffset, input); } } }
public override unsafe void Read(void *fieldAddress, SerializerInput input) { var value = (byte *)(fieldAddress); *value = input.ReadByte(); }