public void GenerateDeserializePart(GenDeserializeContext context) { var g = context.Generator; var count = g.DeclareLocal(typeof(int)); var collection = context.Member.IsReadOnly ? context.Member : g.DeclareLocal(_collectionType); g.BeginAssign(count); { g.Load(context.Reader); g.Call(MemberResolver.GetReadMethod("ReadVarInt32", typeof(int))); } g.EndAssign(); g.If(() => { g.Load(count); g.Load(0); return(BinaryOperator.LessThan); }); { if (context.Member.IsReadOnly) { context.GenerateRaiseInvalidData(_collectionType); } else { g.BeginAssign(collection); { g.LoadDefaultOf(_collectionType); } g.EndAssign(); } } g.Else(); { if (!context.Member.IsReadOnly) { g.BeginAssign(collection); g.BeginNewObject(_ctor); { if (_ctorType == CtorType.Capacity) { g.Load(count); } } g.EndNewObject(); g.EndAssign(); } g.While(() => { g.Load(count); g.Load(0); return(BinaryOperator.GreaterThan); }, () => { var element = g.DeclareLocal(_elementType); g.BeginScope(); { var innerContext = context.CreateChild(g.CreateExpression(element)); _innerBuilder.GenerateDeserializePart(innerContext); } g.EndScope(); g.Load(collection); g.BeginCall(_add); { g.Load(element); } g.EndCall(); g.BeginAssign(count); { g.Load(count); g.Decrement(); } g.EndAssign(); }); } g.EndIf(); if (!context.Member.IsReadOnly) { g.BeginAssign(context.Member); { g.Load(collection); } g.EndAssign(); } }