Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        public override unsafe void Read(void *fieldAddress, SerializerInput input)
        {
            var value = (byte *)(fieldAddress);

            *value = input.ReadByte();
        }