예제 #1
0
 public ArrayDataSerializer(Type elementType, DataSerializer elementSerializer, DataType arrayDataType)
 {
     _size              = UnsafeUtils.GetArrayElementSize(elementType);
     _elementType       = elementType;
     _elementSerializer = elementSerializer;
     _dataType          = arrayDataType;
 }
예제 #2
0
        internal static void LocalInitialize()
        {
            var listType    = typeof(List <object>);
            var itemsMember = listType.GetField("_items", BindingFlags.Instance | BindingFlags.NonPublic);
            var sizeMember  = listType.GetField("_size", BindingFlags.Instance | BindingFlags.NonPublic);

            _itemsFieldOffset = UnsafeUtils.GetFieldOffset(itemsMember);
            _sizeFieldOffset  = UnsafeUtils.GetFieldOffset(sizeMember);
        }
예제 #3
0
        public static                  FieldData[] GetFields(Type type, USerializer uSerializer, bool initializeDataSerializer = true)
        {
            var bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;

            using (var fieldsIterator = new TypeFieldsIterator(8))
            {
                var size   = fieldsIterator.Fill(type, bindingFlags);
                var fields = new FieldData[size];
                var index  = 0;

                for (var i = 0; i < size; i++)
                {
                    var fieldInfo = fieldsIterator[i];

                    if (uSerializer.SerializationPolicy.ShouldSerialize(fieldInfo) == false)
                    {
                        continue;
                    }

                    if (uSerializer.TryGetDataSerializer(fieldInfo.FieldType,
                                                         out var serializationMethods,
                                                         initializeDataSerializer) == false)
                    {
                        continue;
                    }

                    if (serializationMethods == null)
                    {
                        throw new Exception($"Returned null serializer for {fieldInfo.FieldType}");
                    }

                    var fieldOffset = UnsafeUtils.GetFieldOffset(fieldInfo);
                    if (fieldOffset > short.MaxValue)
                    {
                        throw new Exception("Field offset way to big!");
                    }

                    var alternateNames = uSerializer.SerializationPolicy.GetAlternateNames(fieldInfo);

                    fields[index] = new FieldData(fieldInfo.Name, alternateNames, serializationMethods, (ushort)fieldOffset);
                    index++;
                }

                if (index != fields.Length)
                {
                    Array.Resize(ref fields, index);
                }

                OrderFields(fields);

                return(fields);
            }
        }
예제 #4
0
        public ClassFieldWriter(DataSerializer dataSerializer, FieldInfo fieldInfo)
        {
            if (dataSerializer == null)
            {
                throw new ArgumentNullException(nameof(dataSerializer));
            }

            if (fieldInfo == null)
            {
                throw new ArgumentNullException(nameof(fieldInfo));
            }

            if (fieldInfo.DeclaringType.IsClass == false)
            {
                throw new ArgumentException(nameof(fieldInfo));
            }

            _fieldOffset    = UnsafeUtils.GetFieldOffset(fieldInfo);
            _dataSerializer = dataSerializer;
        }
예제 #5
0
 public StructFieldWriter(DataSerializer dataSerializer, FieldInfo fieldInfo)
 {
     _fieldOffset    = UnsafeUtils.GetFieldOffset(fieldInfo);
     _dataSerializer = dataSerializer;
 }