Пример #1
0
        public void Add(MemberSerializerStruct item)
        {
            var membersCount = _members.Count;

            if (membersCount >= 255)
            {
                throw new Exception("To many fields!");
            }

            for (var i = 0; i < membersCount; i++)
            {
                if (item.Hash == _members[i].Hash)
                {
                    throw new Exception("Hash already added!");
                }

                if (item.Hash < _members[i].Hash)
                {
                    _members.Insert(i, item);
                    return;
                }
            }

            _members.Add(item);
        }
Пример #2
0
        public bool AddField <TMember>(int hash, ByRefFieldWriter <T, TMember> .SetDelegate set,
                                       ByRefFieldWriter <T, TMember> .GetDelegate get)
        {
            if (set == null)
            {
                throw new ArgumentNullException(nameof(set));
            }
            if (get == null)
            {
                throw new ArgumentNullException(nameof(get));
            }

            var memberType = typeof(TMember);

            if (Serializer.TryGetDataSerializer(memberType, out var methods, false) == false)
            {
                _serializer.Logger.Error($"{typeof(T)} custom serializer, cannot get serialization methods for field of type {memberType}");
                return(false);
            }

            var toAdd = new MemberSerializerStruct(hash, new ByRefFieldWriter <T, TMember>(methods, set, get));

            Add(toAdd);
            return(true);
        }
Пример #3
0
        public bool AddBackingField(int hash, string propertyName)
        {
            if (propertyName == null)
            {
                throw new ArgumentNullException(nameof(propertyName));
            }

            var type = typeof(T);

            var formattedFieldName = $"<{propertyName}>k__BackingField";

            var field = type.GetField(formattedFieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            if (field == null)
            {
                _serializer.Logger.Error($"{type} custom serializer, cannot get backing field for property {propertyName}");
                return(false);
            }

            if (Serializer.TryGetDataSerializer(field.FieldType, out var methods, false) == false)
            {
                _serializer.Logger.Error($"{type} custom serializer, cannot get serialization methods for field of type {field.FieldType}");
                return(false);
            }

            var toAdd = new MemberSerializerStruct(hash, new StructFieldWriter(methods, field));

            Add(toAdd);
            return(true);
        }
Пример #4
0
        public void AddProperty <TMember>(int hash, string name)
        {
            var memberType = typeof(TMember);
            var type       = typeof(T);

            if (Serializer.TryGetDataSerializer(memberType, out var methods, false) == false)
            {
                _serializer.Logger.Error($"{type} custom serializer, cannot get serialization methods for field of type {memberType}");
                return;
            }

            var property = type.GetProperty(name);

            if (property == null)
            {
                _serializer.Logger.Error($"{type} custom serializer, cannot get property {name} of type {memberType}");
                return;
            }

            var get = (GetPropertyDelegate <T, TMember>)Delegate.CreateDelegate(typeof(GetPropertyDelegate <T, TMember>), null, property.GetGetMethod());
            var set = (SetPropertyDelegate <T, TMember>)Delegate.CreateDelegate(typeof(SetPropertyDelegate <T, TMember>), null, property.GetSetMethod());

            var toAdd = new MemberSerializerStruct(hash, new PropertyWriter <T, TMember>(methods, set, get));

            Add(toAdd);
        }
Пример #5
0
        public bool AddArrayField <TElement>(int hash,
                                             FieldArrayWriter <T, TElement> .GetLengthDelegate getLength, FieldArrayWriter <T, TElement> .GetElementDelegate getElement,
                                             FieldArrayWriter <T, TElement> .SetLengthDelegate setLength, FieldArrayWriter <T, TElement> .SetElementDelegate setElement)
        {
            var memberType = typeof(TElement);

            if (_serializer.TryGetDataSerializer(memberType, out var elementSerializer, false) == false)
            {
                _serializer.Logger.Error($"{typeof(T)} custom serializer, cannot get serialization methods for element of type {memberType}");
                return(false);
            }

            var toAdd = new MemberSerializerStruct(hash, new FieldArrayWriter <T, TElement>(elementSerializer, getLength, setLength, getElement, setElement, _serializer));

            Add(toAdd);
            return(true);
        }