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); }
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); }