コード例 #1
0
        public override unsafe void Write(void *fieldAddress, SerializerOutput output)
        {
            var array = Unsafe.Read <bool[]>(fieldAddress);

            if (array == null)
            {
                output.WriteNull();
                return;
            }

            var count = array.Length;

            if (count > 0)
            {
                var sizeTracker = output.BeginSizeTrack();
                {
                    output.EnsureNext(6 + (count * sizeof(bool)));
                    output.Write7BitEncodedIntUnchecked(count);
                    output.WriteByteUnchecked((byte)_elementDataType);
                    output.WriteBoolsUnchecked(array, count);
                }
                output.WriteSizeTrack(sizeTracker);
            }
            else
            {
                output.EnsureNext(5);
                output.WriteIntUnchecked(1); //size tracker
                output.WriteByteUnchecked(0);
            }
        }
コード例 #2
0
        public override void Write(void *fieldAddress, SerializerOutput output)
        {
            var obj = Unsafe.Read <object>(fieldAddress);

            if (obj == null)
            {
                output.WriteNull();
                return;
            }

            if (_stack >= MaxStack)
            {
                throw new CircularReferenceException("Circular references are not suported!");
            }

            _stack++;

            var track = output.BeginSizeTrack();

            var pinnable = Unsafe.As <object, PinnableObject>(ref obj);

            fixed(byte *objectAddress = &pinnable.Pinnable)
            {
                _fieldsSerializer.Write(objectAddress, output);
            }

            output.WriteSizeTrack(track);

            _stack--;
        }
コード例 #3
0
        public unsafe bool Serialize(SerializerOutput output, object o)
        {
            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            var type = o.GetType();

            if (TryGetDataSerializer(type, out var serializationMethods))
            {
                if (type.IsValueType)
                {
                    var pinnable = Unsafe.As <object, PinnableObject>(ref o);
                    fixed(byte *objectAddress = &pinnable.Pinnable)
                    {
                        serializationMethods.Write(objectAddress, output);
                    }
                }
                else
                {
                    var fieldAddress = Unsafe.AsPointer(ref o);
                    serializationMethods.Write(fieldAddress, output);
                }

                return(true);
            }

            return(false);
        }
コード例 #4
0
        public override void Write(void *fieldAddress, SerializerOutput output)
        {
            var track = output.BeginSizeTrack();

            _fieldsSerializer.Write((byte *)fieldAddress, output);

            output.WriteSizeTrack(track);
        }
コード例 #5
0
        public override void Write(void *fieldAddress, SerializerOutput output)
        {
            var obj = Unsafe.Read <object>(fieldAddress);//obj should not be null here

            var pinnable = Unsafe.As <object, PinnableObject>(ref obj);

            fixed(byte *objectAddress = &pinnable.Pinnable)
            {
                _dataSerializer.Write(objectAddress + _fieldOffset, output);
            }
        }
コード例 #6
0
        public override unsafe void Write(void *fieldAddress, SerializerOutput output)
        {
            if (Unsafe.Read <object>(fieldAddress) == null)
            {
                output.WriteNull();
                return;
            }

            var track = output.BeginSizeTrack();

            _memberSerializer.Write((byte *)fieldAddress, output);

            output.WriteSizeTrack(track);
        }
コード例 #7
0
ファイル: FieldData.cs プロジェクト: ddalacu/USerializer
        public void Write(byte *objectAddress, SerializerOutput output)
        {
            output.WriteBytes(_headerData, _headerData.Length);

            var typeDataFields = _fields;
            var fieldsLength   = typeDataFields.Length;

            for (var index = 0; index < fieldsLength; index++)
            {
                var fieldData      = typeDataFields[index];
                var dataSerializer = fieldData.SerializationMethods;
                dataSerializer.Write(objectAddress + fieldData.Offset, output);
            }
        }
コード例 #8
0
        public void Write(byte *objectAddress, SerializerOutput output)
        {
            var typeDataFields = Members;

            var fieldsLength = typeDataFields.Length;

            output.WriteBytes(_headerData, _headerData.Length);

            for (var index = 0; index < fieldsLength; index++)
            {
                var fieldData      = typeDataFields[index];
                var dataSerializer = fieldData.DataSerializer;
                dataSerializer.Write(objectAddress, output);
            }
        }
コード例 #9
0
        public unsafe bool SerializeTyped <T>(SerializerOutput output, T value) where T : struct
        {
            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            var type = value.GetType();

            if (TryGetDataSerializer(type, out var serializationMethods))
            {
                var fieldAddress = Unsafe.AsPointer(ref value);
                serializationMethods.Write(fieldAddress, output);
                return(true);
            }

            return(true);
        }
コード例 #10
0
        public override void Write(void *fieldAddress, SerializerOutput output)
        {
            var array = Unsafe.Read <Array>(fieldAddress);

            if (array == null)
            {
                output.WriteNull();
                return;
            }

            var count = array.Length;


            if (count > 0)
            {
                var sizeTracker = output.BeginSizeTrack();
                {
                    output.EnsureNext(6);
                    output.Write7BitEncodedIntUnchecked(count);
                    output.WriteByteUnchecked((byte)_elementDataType);

                    var pinnable = Unsafe.As <Array, byte[]>(ref array);

                    fixed(byte *address = pinnable)
                    {
                        var tempAddress = address;

                        for (var index = 0; index < count; index++)
                        {
                            _elementSerializer.Write(tempAddress, output);
                            tempAddress += _size;
                        }
                    }
                }
                output.WriteSizeTrack(sizeTracker);
            }
            else
            {
                output.EnsureNext(5);
                output.WriteIntUnchecked(1); //size tracker
                output.WriteByteUnchecked(0);
            }
        }
コード例 #11
0
        public override unsafe void Write(void *fieldAddress, SerializerOutput output)
        {
            var value = *(float *)(fieldAddress);

            output.WriteFloat(value);
        }
コード例 #12
0
        public override unsafe void Write(void *fieldAddress, SerializerOutput output)
        {
            var obj = Unsafe.Read <string>(fieldAddress);

            output.WriteString(obj);
        }
コード例 #13
0
        public override unsafe void Write(void *fieldAddress, SerializerOutput output)
        {
            var value = *(long *)(fieldAddress);

            output.WriteInt64(value);
        }
コード例 #14
0
        public override unsafe void Write(void *fieldAddress, SerializerOutput output)
        {
            var value = *(ushort *)(fieldAddress);

            output.WriteUInt16(value);
        }
コード例 #15
0
 public override void Write(void *fieldAddress, SerializerOutput output)
 {
     ref var instance = ref Unsafe.AsRef <T>(fieldAddress);
コード例 #16
0
        public override void Write(void *fieldAddress, SerializerOutput output)
        {
            var value = _get(Unsafe.Read <T>(fieldAddress));

            _dataSerializer.Write(Unsafe.AsPointer(ref value), output);
        }
コード例 #17
0
 public abstract void Write(void *fieldAddress, SerializerOutput output);
コード例 #18
0
        public override void Write(void *fieldAddress, SerializerOutput output)
        {
            var address = (byte *)fieldAddress + _fieldOffset;

            _dataSerializer.Write(address, output);
        }
コード例 #19
0
        public override unsafe void Write(void *fieldAddress, SerializerOutput output)
        {
            var value = *(double *)(fieldAddress);

            output.WriteDouble(value);
        }
コード例 #20
0
 public override void Write(void *fieldAddress, SerializerOutput output)
 {
     throw new NotImplementedException();
 }
コード例 #21
0
        public void Serialize(ref T item, SerializerOutput output)
        {
            var childAddress = Unsafe.AsPointer(ref item);

            _methods.Write(childAddress, output);
        }