Esempio n. 1
0
 /// <summary>
 /// Creates a new ValueMember instance
 /// </summary>
 public ValueMember(
     MemberMainSettingsValue memberSettings, ValueSerializationSettings valueSerializationSettings, MemberInfo member, Type parentType, RuntimeTypeModel model, bool isAccessHandledOutside = false, bool canHaveDefaultValue = true)
 {
     if (member == null)
     {
         throw new ArgumentNullException(nameof(member));
     }
     if (parentType == null)
     {
         throw new ArgumentNullException(nameof(parentType));
     }
     if (model == null)
     {
         throw new ArgumentNullException(nameof(model));
     }
     MemberType           = valueSerializationSettings.GetSettingsCopy(0).Basic.EffectiveType ?? Helpers.GetMemberType(member);
     Member               = member;
     ParentType           = parentType;
     _model               = model;
     _canHaveDefaultValue = canHaveDefaultValue;
     _main = memberSettings;
     _isAccessHandledOutside = isAccessHandledOutside;
     _vsByClient             = valueSerializationSettings.Clone();
     if (!canHaveDefaultValue && _vsByClient.DefaultValue != null)
     {
         throw new ArgumentException("Default value was already set but the member " + Name + " can't have a default value", nameof(valueSerializationSettings));
     }
 }
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            // always consider ProtoMember if not strict Aqla
            // even if no [ProtoContract] was declared!
            if (!s.Input.CanUse(AttributeType.ProtoBuf))
            {
                return(MemberHandlerResult.NotFound);
            }
            if (HasProtobufNetIgnore(s.Input.Attributes, model))
            {
                return(MemberHandlerResult.Ignore);
            }
            var attrib = AttributeMap.GetAttribute(s.Input.Attributes, "ProtoBuf.ProtoMemberAttribute");

            if (attrib != null)
            {
                var r = _strategy.TryRead(attrib, s, member, model);
                // we have ref!
                main = s.MainValue;
                return(r);
            }
            return(MemberHandlerResult.NotFound);
        }
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            if (!s.Input.CanUse(AttributeType.Aqla))
            {
                return(MemberHandlerResult.NotFound);
            }
            if (HasAqlaIgnore(s.Input.Attributes, model))
            {
                return(MemberHandlerResult.Ignore);
            }
            MemberHandlerResult result = MemberHandlerResult.NotFound;

            foreach (AttributeMap ppma in s.Input.PartialMembers)
            {
                object tmp;
                if (!ppma.TryGet("MemberName", out tmp) || tmp as string != member.Name)
                {
                    continue;
                }

                if (ppma.AttributeType.FullName == "AqlaSerializer.PartialNonSerializableMemberAttribute" && CheckAqlaModelId(ppma, model))
                {
                    return(MemberHandlerResult.Ignore);
                }

                MemberHandlerResult newResult;
                if (Helpers.IsAssignableFrom(model.MapType(typeof(SerializablePartialMemberAttribute)), ppma.AttributeType))
                {
                    var attr = ppma.GetRuntimeAttribute <SerializablePartialMemberAttribute>(model);
                    main = attr.MemberSettings;
                    s.SerializationSettings.DefaultValue = attr.DefaultValue;
                    s.SerializationSettings.SetSettings(attr.LevelSettings, 0);

                    s.TagIsPinned = main.Tag > 0;
                    newResult     = s.TagIsPinned ? MemberHandlerResult.Done : MemberHandlerResult.Partial;
                }
                else
                {
                    newResult = MemberHandlerResult.NotFound;
                }

                if (newResult == MemberHandlerResult.Done)
                {
                    return(MemberHandlerResult.Done);
                }
                if (newResult == MemberHandlerResult.Partial)
                {
                    result = newResult;
                }
            }
            return(result);
        }
Esempio n. 4
0
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            if (!s.Input.CanUse(AttributeType.ProtoBuf))
            {
                return(MemberHandlerResult.NotFound);
            }
            if (HasProtobufNetIgnore(s.Input.Attributes, model))
            {
                return(MemberHandlerResult.Ignore);
            }
            MemberHandlerResult result = MemberHandlerResult.NotFound;

            foreach (AttributeMap ppma in s.Input.PartialMembers)
            {
                object tmp;
                if (!ppma.TryGet("MemberName", out tmp) || tmp as string != member.Name)
                {
                    continue;
                }

                if (ppma.AttributeType.FullName == "ProtoBuf.ProtoPartialIgnoreAttribute")
                {
                    return(MemberHandlerResult.Ignore);
                }

                MemberHandlerResult newResult;
                if (ppma.AttributeType.FullName == "ProtoBuf.ProtoPartialMemberAttribute")
                {
                    newResult = _strategy.TryRead(ppma, s, member, model);
                    // we have ref!
                    main = s.MainValue;
                }
                else
                {
                    newResult = MemberHandlerResult.NotFound;
                }

                if (newResult == MemberHandlerResult.Done)
                {
                    return(MemberHandlerResult.Done);
                }
                if (newResult == MemberHandlerResult.Partial)
                {
                    result = newResult;
                }
            }
            return(result);
        }
Esempio n. 5
0
        internal MetaType(RuntimeTypeModel model, Type type, MethodInfo factory)
        {
            this._factory = factory;
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            this._model = model;

            IProtoSerializer coreSerializer = model.TryGetBasicTypeSerializer(type);

            if (coreSerializer != null)
            {
                throw InbuiltType(type);
            }

            this.Type = type;

#if WINRT
            this._typeInfo = type.GetTypeInfo();
#endif

            MemberInfo[] members;

            _tupleCtor = ResolveTupleConstructor(Type, out members);
            if (_tupleCtor != null)
            {
                foreach (MemberInfo memberInfo in members)
                {
                    var level = new MemberLevelSettingsValue();
                    var vs    = new ValueSerializationSettings();
                    vs.SetSettings(new ValueSerializationSettings.LevelValue(level)
                    {
                        IsNotAssignable = true
                    }, 0);
                    vs.DefaultLevel = new ValueSerializationSettings.LevelValue(level.MakeDefaultNestedLevel());
                    var main = new MemberMainSettingsValue()
                    {
                        Name = memberInfo.Name
                    };
                    var vm = new ValueMember(main, vs, memberInfo, Type, model, canHaveDefaultValue: false, isAccessHandledOutside: true);
                    AddTupleField(vm);
                }
            }
        }
Esempio n. 6
0
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            // always consider SerializableMember if not strict ProtoBuf
            // even if no [SerializableType] was declared!
            if (!s.Input.CanUse(AttributeType.Aqla))
            {
                return(MemberHandlerResult.NotFound);
            }
            if (HasAqlaIgnore(s.Input.Attributes, model))
            {
                return(MemberHandlerResult.Ignore);
            }
            var memberRtAttr = AttributeMap.CreateRuntime <SerializableMemberAttribute>(model, member, true).FirstOrDefault(attr => CheckAqlaModelId(attr, model));

            if (memberRtAttr == null)
            {
                return(MemberHandlerResult.NotFound);
            }

            SerializableMemberNestedAttribute[] nested = AttributeMap
                                                         .CreateRuntime <SerializableMemberNestedAttribute>(model, member, true)
                                                         .Where(a => a.ModelId == model.ModelId)
                                                         .ToArray();

            main = memberRtAttr.MemberSettings;

            s.SerializationSettings.SetSettings(memberRtAttr.LevelSettings, 0);

            s.SerializationSettings.DefaultValue = memberRtAttr.DefaultValue;

            foreach (var lvl in nested)
            {
                if (s.SerializationSettings.HasSettingsSpecified(lvl.Level))
                {
                    throw new InvalidOperationException("Level " + lvl.Level + " settings for member " + member + " has been already initialized");
                }
                s.SerializationSettings.SetSettings(lvl.LevelSettings, lvl.Level);
            }

            s.TagIsPinned = memberRtAttr.Tag > 0;
            return(s.TagIsPinned ? MemberHandlerResult.Done : MemberHandlerResult.Partial);
        }
Esempio n. 7
0
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            if (!s.Input.CanUse(AttributeType.SystemNonSerialized))
            {
                return(MemberHandlerResult.NotFound);
            }
            var attrib = AttributeMap.GetAttribute(s.Input.Attributes, "System.NonSerializedAttribute");

            if (attrib != null)
            {
                return(MemberHandlerResult.Ignore);
            }
            return(MemberHandlerResult.NotFound);
        }
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            if (!s.Input.CanUse(AttributeType.DataContract))
            {
                return(MemberHandlerResult.NotFound);
            }

            if (!s.Input.HasFamily(MetaType.AttributeFamily.DataContractSerialier))
            {
                return(MemberHandlerResult.NotFound);
            }
            var attrib = AttributeMap.GetAttribute(s.Input.Attributes, "System.Runtime.Serialization.DataMemberAttribute");

            if (attrib == null)
            {
                return(MemberHandlerResult.NotFound);
            }

            if (main.Tag <= 0)
            {
                attrib.TryGetNotDefault("Order", ref main.Tag);
            }
            if (string.IsNullOrEmpty(main.Name))
            {
                attrib.TryGetNotEmpty("Name", ref main.Name);
            }
            if (!main.IsRequiredInSchema)
            {
                attrib.TryGetNotDefault("IsRequired", ref main.IsRequiredInSchema);
            }
            bool done = main.Tag >= s.MinAcceptFieldNumber;

            if (done)
            {
                main.Tag += s.Input.DataMemberOffset; // dataMemberOffset only applies to DCS flags, to allow us to "bump" WCF by a notch
                return(MemberHandlerResult.Done);
            }
            return(MemberHandlerResult.Partial);
        }
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember ||
                s.MainValue.Tag > 0 ||
                s.TagIsPinned ||
                s.SerializationSettings.MaxSpecifiedNestedLevel != -1 ||
                s.Input.Family != MetaType.AttributeFamily.ProtoBuf ||
                !s.Input.IsForced)
            {
                return(MemberHandlerResult.NotFound);
            }

            var l = s.SerializationSettings.GetSettingsCopy(0);

            l.Basic.DefaultsMode = MemberDefaultsMode.Legacy;
            _strategy.SetLegacyFormat(ref l.Basic, member, model);
            s.SerializationSettings.SetSettings(l, 0);

            return(MemberHandlerResult.Partial);
        }
Esempio n. 10
0
        public virtual MappedMember Map(MemberArgsValue args)
        {
            if (args.Member == null || (args.Family == MetaType.AttributeFamily.None && !args.IsEnumValueMember))
            {
                return(null);
            }
            if (args.Member.Name == "Values")
            {
            }
            if (args.IsEnumValueMember)
            {
                args.IsForced = true;
            }
            var state = new MemberState(args);
            MemberMainSettingsValue m = state.MainValue;

            m.Tag           = int.MinValue;
            state.MainValue = m;

            if (ProcessHandlers(state) == MemberHandlerResult.Ignore || (state.MainValue.Tag < state.MinAcceptFieldNumber && !state.Input.IsForced))
            {
                return(null);
            }

            if (!state.SerializationSettings.HasSettingsSpecified(0))
            {
                state.SerializationSettings.SetSettings(state.SerializationSettings.GetSettingsCopy(0), 0);
            }

            if (state.SerializationSettings.DefaultLevel == null)
            {
                state.SerializationSettings.DefaultLevel = new ValueSerializationSettings.LevelValue(state.SerializationSettings.GetSettingsCopy(0).Basic.MakeDefaultNestedLevel());
            }

            return(new MappedMember(state)
            {
                ForcedTag = state.Input.IsForced || state.Input.InferTagByName
            });
        }
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            if (s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            if (!s.Input.CanUse(AttributeType.Xml))
            {
                return(MemberHandlerResult.NotFound);
            }
            if (AttributeMap.GetAttribute(s.Input.Attributes, "System.Xml.Serialization.XmlIgnoreAttribute") != null)
            {
                return(MemberHandlerResult.Ignore);
            }
            if (!s.Input.HasFamily(MetaType.AttributeFamily.XmlSerializer))
            {
                return(MemberHandlerResult.NotFound);
            }
            var attrib = AttributeMap.GetAttribute(s.Input.Attributes, "System.Xml.Serialization.XmlElementAttribute")
                         ?? AttributeMap.GetAttribute(s.Input.Attributes, "System.Xml.Serialization.XmlArrayAttribute");

            if (attrib == null)
            {
                return(MemberHandlerResult.NotFound);
            }

            if (main.Tag <= 0)
            {
                attrib.TryGetNotDefault("Order", ref main.Tag);
            }
            if (string.IsNullOrEmpty(main.Name))
            {
                attrib.TryGetNotEmpty("ElementName", ref main.Name);
            }

            return(main.Tag >= s.MinAcceptFieldNumber ? MemberHandlerResult.Done : MemberHandlerResult.Partial);
        }
 protected abstract MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model);
Esempio n. 13
0
        private ValueMember AddField(int fieldNumber, string memberName, Type itemType, Type defaultType, object defaultValue)
        {
            if (Type.IsArray)
            {
                throw new InvalidOperationException("Can't add fields to array type");
            }
            MemberInfo mi = null;

#if WINRT
            mi = Helpers.IsEnum(Type) ? Type.GetTypeInfo().GetDeclaredField(memberName) : Helpers.GetInstanceMember(Type.GetTypeInfo(), memberName);
#else
            MemberInfo[] members = Type.GetMember(memberName, Helpers.IsEnum(Type) ? BindingFlags.Static | BindingFlags.Public : BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            if (members != null && members.Length == 1)
            {
                mi = members[0];
            }
#endif
            if (mi == null)
            {
                throw new ArgumentException("Unable to determine member: " + memberName, nameof(memberName));
            }

            Type miType;
#if WINRT || PORTABLE
            PropertyInfo pi = mi as PropertyInfo;
            if (pi == null)
            {
                FieldInfo fi = mi as FieldInfo;
                if (fi == null)
                {
                    throw new NotSupportedException(mi.GetType().Name);
                }
                else
                {
                    miType = fi.FieldType;
                }
            }
            else
            {
                miType = pi.PropertyType;
            }
#else
            switch (mi.MemberType)
            {
            case MemberTypes.Field:
                miType = ((FieldInfo)mi).FieldType; break;

            case MemberTypes.Property:
                miType = ((PropertyInfo)mi).PropertyType; break;

            default:
                throw new NotSupportedException(mi.MemberType.ToString());
            }
#endif
            // we can't check IgnoreListHandling (because of recursion when adding type) but we don't need to
            // it will be checked in ValueSerializedBuilder.CompleteLevel stage
            ResolveListTypes(_model, miType, ref itemType, ref defaultType);

            var serializationSettings = new ValueSerializationSettings();
            var memberSettings        = new MemberMainSettingsValue {
                Tag = fieldNumber
            };

            var level0 = serializationSettings.GetSettingsCopy(0).Basic;
            level0.Collection.ConcreteType = defaultType;
            level0.Collection.ItemType     = itemType;

            serializationSettings.SetSettings(level0, 0);

            serializationSettings.DefaultValue = defaultValue;

            var def = serializationSettings.DefaultLevel.GetValueOrDefault();
            def.Basic = level0.MakeDefaultNestedLevel();
            serializationSettings.DefaultLevel = def;

            ValueMember newField = new ValueMember(memberSettings, serializationSettings, mi, Type, _model);
            Add(newField);
            return(newField);
        }
        protected override MemberHandlerResult TryMap(MemberState s, ref MemberMainSettingsValue main, MemberInfo member, RuntimeTypeModel model)
        {
            // always consider SerializableMember if not strict ProtoBuf
            if (!s.Input.IsEnumValueMember)
            {
                return(MemberHandlerResult.NotFound);
            }
            if (main.Tag <= 0)
            {
                try
                {
                    main.Tag = Helpers.GetEnumMemberUnderlyingValue(member);
                }
                catch (OverflowException)
                {
                    // should use EnumPassthrough for this value
                    return(MemberHandlerResult.NotFound);
                }
            }
            if (!s.Input.CanUse(RequiredAttributeType))
            {
                return(MemberHandlerResult.Partial);
            }
            if (HasIgnore(s))
            {
                return(MemberHandlerResult.Ignore);
            }

            AttributeMap attrib = GetAttribute(s);

            if (attrib == null)
            {
                return(MemberHandlerResult.Partial);
            }

            if (string.IsNullOrEmpty(main.Name))
            {
                attrib.TryGetNotEmpty("Name", ref main.Name);
            }

#if !FEAT_IKVM // IKVM can't access HasValue, but conveniently, Value will only be returned if set via ctor or property
            if ((bool)Helpers.GetInstanceMethod(
                    attrib.AttributeType
#if WINRT
                    .GetTypeInfo()
#endif
                    ,
                    "HasValue").Invoke(attrib.Target, null))
#endif
            {
                object tmp;
                if (attrib.TryGet("Value", out tmp))
                {
                    main.Tag = (int)tmp;
                }
            }

            s.TagIsPinned = main.Tag > 0;

            return(s.TagIsPinned ? MemberHandlerResult.Done : MemberHandlerResult.Partial);
        }