Esempio n. 1
0
        public override object Read(object value, ProtoReader source)
        {
            int    trappedKey      = ProtoReader.ReserveNoteObject(source);
            object builderInstance = _builderFactory.Invoke(null, null);

            object[] args = new object[1];

            if (AppendToCollection && value != null && ((IList)value).Count != 0)
            {
                if (_addRange != null)
                {
                    args[0] = value;
                    _addRange.Invoke(builderInstance, args);
                }
                else
                {
                    foreach (object item in (IList)value)
                    {
                        args[0] = item;
                        _add.Invoke(builderInstance, args);
                    }
                }
            }

            ListHelpers.Read(null, null,
                             o =>
            {
                args[0] = o;
                _add.Invoke(builderInstance, args);
            },
                             source);

            var r = _finish.Invoke(builderInstance, null);

            ProtoReader.NoteReservedTrappedObject(trappedKey, r, source);
            return(r);
        }
Esempio n. 2
0
        public override object Read(object value, ProtoReader source)
        {
            IList list = null;

            object[] args       = null;
            bool     createdNew = false;
            bool     asList     = IsList && !SuppressIList;

            // can't call clear? => create new!
            bool forceNewInstance = !AppendToCollection && !asList;

            ListHelpers.Read(
                () =>
            {
                if (_metaType != null && source.TryReadFieldHeader(ListHelpers.FieldSubtype))
                {
                    MetaType mt = _subTypeHelpers.TryRead(_metaType, forceNewInstance ? null : value?.GetType(), source);
                    if (mt != null)
                    {
                        value      = mt.Serializer.CreateInstance(source);
                        createdNew = true;
                    }
                    return(true);
                }
                return(false);
            },
                () =>
            {
                if (value == null || (forceNewInstance && !createdNew))
                {
                    createdNew = true;
                    value      = Activator.CreateInstance(_concreteTypeDefault);
                    ProtoReader.NoteObject(value, source);
                    if (asList)
                    {
                        list = (IList)value;
                        Debug.Assert(list != null);
                    }
                }
                else
                {
                    if (!createdNew)
                    {
                        ProtoReader.NoteObject(value, source);
                    }

                    if (asList)
                    {
                        list = (IList)value;
                        Debug.Assert(list != null);
                        if (!AppendToCollection && !createdNew)
                        {
                            list.Clear();
                        }
                    }
                }

                if (!asList)
                {
                    args = new object[1];
                }
            },
                v =>
            {
                if (asList)
                {
                    list.Add(v);
                }
                else
                {
                    args[0] = v;
                    this._add.Invoke(value, args);
                }
            },
                source);

            return(value);
        }