internal void ReadRecord(RecordReader reader, bool lazyLoading) { var compinfo = InfoProvider.GetCompoundInfo(GetType()); var recinfo = InfoProvider.GetRecordInfo(GetType()); BeforeRead(reader); reader.BeginReadFields(0); HashSet <string> remainingPropertiesToLoad = lazyLoading ? new HashSet <string>(compinfo.Members.Values.Where(m => m.IsLazy).SelectMany(m => m.FieldNames)) : null; foreach (string propertyName in reader.FindFields()) { MemberInfo meminf = compinfo.FindMember(propertyName); if (meminf != null) { reader.ReadField(this, propertyName, meminf, 0); if (remainingPropertiesToLoad != null) { if (!meminf.IsListType && !meminf.IsDynamic) { remainingPropertiesToLoad.Remove(propertyName); } if (!remainingPropertiesToLoad.Any()) { // Loaded all properties that were supposed to reader.CancelFindFields(); break; } } } else if (lazyLoading || recinfo.IsDummyRecord) { // Prevent segment errors when not all properties were expected to be consumed reader.SeekEndOfSegment(); } else { Log.Warning("Unexpected record property: {0}", propertyName); } } reader.EndReadFields(0); //// Make sure list properties that were supposed to be loaded are not null //foreach (MemberInfo meminfo in members.Where(m => m.Value.IsListType && (fieldsToLoad == null || fieldsToLoad.Contains(m.Key))).Select(m => m.Value)) //{ // meminfo.EnsureListCreated(this); //} AfterRead(reader); }
internal void OnComplete(RecordReader reader, int depth) { reader.EndReadFields(depth); // Make sure list fields that were supposed to be loaded are not null var members = InfoProvider.GetCompoundInfo(GetType()).Members; foreach (MemberInfo meminfo in members.Where(m => m.Value.IsListType).Select(m => m.Value)) { meminfo.EnsureListCreated(this); } AfterRead(reader); }