public TField ReadValue <TInput>(ref Reader <TInput> reader, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <TField, TInput>(ref reader, field)); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(reader.Session); var fieldType = field.FieldType; if (fieldType is null || fieldType == CodecFieldType) { TSurrogate surrogate = default; _surrogateSerializer.Deserialize(ref reader, ref surrogate); var result = ConvertFromSurrogate(ref surrogate); ReferenceCodec.RecordObject(reader.Session, result, placeholderReferenceId); return(result); } // The type is a descendant, not an exact match, so get the specific serializer for it. var specificSerializer = reader.Session.CodecProvider.GetCodec(fieldType); if (specificSerializer != null) { return((TField)specificSerializer.ReadValue(ref reader, field)); } ThrowSerializerNotFoundException(fieldType); return(null); }
public T[] ReadValue <TInput>(ref Reader <TInput> reader, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <T[], TInput>(ref reader, field)); } if (field.WireType != WireType.TagDelimited) { ThrowUnsupportedWireTypeException(field); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(reader.Session); T[] result = null; uint fieldId = 0; var length = 0; var index = 0; while (true) { var header = reader.ReadFieldHeader(); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; switch (fieldId) { case 0: length = Int32Codec.ReadValue(ref reader, header); result = new T[length]; ReferenceCodec.RecordObject(reader.Session, result, placeholderReferenceId); break; case 1: if (result is null) { return(ThrowLengthFieldMissing()); } if (index >= length) { return(ThrowIndexOutOfRangeException(length)); } result[index] = _fieldCodec.ReadValue(ref reader, header); ++index; break; default: reader.ConsumeUnknownField(header); break; } } return(result); }
List <T> IFieldCodec <List <T> > .ReadValue <TInput>(ref Reader <TInput> reader, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <List <T>, TInput>(ref reader, field)); } if (field.WireType != WireType.TagDelimited) { ThrowUnsupportedWireTypeException(field); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(reader.Session); List <T> result = null; uint fieldId = 0; var length = 0; var index = 0; while (true) { var header = reader.ReadFieldHeader(); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; switch (fieldId) { case 0: length = Int32Codec.ReadValue(ref reader, header); result = _activator.Create(length); result.Capacity = length; ReferenceCodec.RecordObject(reader.Session, result, placeholderReferenceId); break; case 1: if (result is null) { ThrowLengthFieldMissing(); } if (index >= length) { ThrowIndexOutOfRangeException(length); } // ReSharper disable once PossibleNullReferenceException result.Add(_fieldCodec.ReadValue(ref reader, header)); ++index; break; default: reader.ConsumeUnknownField(header); break; } } return(result); }
Dictionary <TKey, TValue> IFieldCodec <Dictionary <TKey, TValue> > .ReadValue <TInput>(ref Reader <TInput> reader, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <Dictionary <TKey, TValue>, TInput>(ref reader, field)); } if (field.WireType != WireType.TagDelimited) { ThrowUnsupportedWireTypeException(field); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(reader.Session); Dictionary <TKey, TValue> result = null; IEqualityComparer <TKey> comparer = null; uint fieldId = 0; while (true) { var header = reader.ReadFieldHeader(); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; switch (fieldId) { case 0: comparer = _comparerCodec.ReadValue(ref reader, header); break; case 1: if (result is null) { result = CreateInstance(comparer, reader.Session, placeholderReferenceId); } var pair = _pairCodec.ReadValue(ref reader, header); // ReSharper disable once PossibleNullReferenceException result.Add(pair.Key, pair.Value); break; default: reader.ConsumeUnknownField(header); break; } } if (result is null) { result = CreateInstance(comparer, reader.Session, placeholderReferenceId); } return(result); }
public List <T> ReadValue(Reader reader, SerializerSession session, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <List <T> >(reader, session, field, this.codecProvider)); } if (field.WireType != WireType.TagDelimited) { ThrowUnsupportedWireTypeException(field); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(session); List <T> result = null; uint fieldId = 0; var length = 0; var index = 0; while (true) { var header = reader.ReadFieldHeader(session); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; switch (fieldId) { case 0: length = this.intCodec.ReadValue(reader, session, header); result = this.activator.Create(length); result.Capacity = length; ReferenceCodec.RecordObject(session, result, placeholderReferenceId); break; case 1: if (result == null) { ThrowLengthFieldMissing(); } if (index >= length) { ThrowIndexOutOfRangeException(length); } // ReSharper disable once PossibleNullReferenceException result.Add(this.fieldCodec.ReadValue(reader, session, header)); ++index; break; default: reader.ConsumeUnknownField(session, header); break; } } return(result); }
public TField ReadValue <TInput>(ref Reader <TInput> reader, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <TField, TInput>(ref reader, field)); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(reader.Session); TSurrogate surrogate = default; _surrogateSerializer.Deserialize(ref reader, ref surrogate); var result = ConvertFromSurrogate(ref surrogate); ReferenceCodec.RecordObject(reader.Session, result, placeholderReferenceId); return(result); }
Tuple <T> IFieldCodec <Tuple <T> > .ReadValue <TInput>(ref Reader <TInput> reader, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <Tuple <T>, TInput>(ref reader, field)); } if (field.WireType != WireType.TagDelimited) { ThrowUnsupportedWireTypeException(field); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(reader.Session); var item1 = default(T); uint fieldId = 0; while (true) { var header = reader.ReadFieldHeader(); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; switch (fieldId) { case 1: item1 = _valueCodec.ReadValue(ref reader, header); break; default: reader.ConsumeUnknownField(header); break; } } var result = new Tuple <T>(item1); ReferenceCodec.RecordObject(reader.Session, result, placeholderReferenceId); return(result); }
public Tuple <T> ReadValue(Reader reader, SerializerSession session, Field field) { if (field.WireType != WireType.TagDelimited) { ThrowUnsupportedWireTypeException(field); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(session); var item1 = default(T); uint fieldId = 0; while (true) { var header = reader.ReadFieldHeader(session); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; switch (fieldId) { case 0: item1 = this.valueCodec.ReadValue(reader, session, header); break; default: reader.ConsumeUnknownField(session, header); break; } } var result = new Tuple <T>(item1); ReferenceCodec.RecordObject(session, result, placeholderReferenceId); return(result); }
public object ReadValue(ref Reader reader, SerializerSession session, Field field) { if (field.WireType == WireType.Reference) { return(ReferenceCodec.ReadReference <T[]>(ref reader, session, field)); } if (field.WireType != WireType.TagDelimited) { ThrowUnsupportedWireTypeException(field); } var placeholderReferenceId = ReferenceCodec.CreateRecordPlaceholder(session); Array result = null; uint fieldId = 0; int[] lengths = null; int[] indices = null; var rank = 0; while (true) { var header = reader.ReadFieldHeader(session); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; switch (fieldId) { case 0: { lengths = this.intArrayCodec.ReadValue(ref reader, session, header); rank = lengths.Length; // Multi-dimensional arrays must be indexed using indexing arrays, so create one now. indices = new int[rank]; result = Array.CreateInstance(typeof(T), lengths); ReferenceCodec.RecordObject(session, result, placeholderReferenceId); break; } case 1: { if (result == null) { return(ThrowLengthsFieldMissing()); } var element = this.elementCodec.ReadValue(ref reader, session, header); result.SetValue(element, indices); // Increment the indices array by 1. var idx = rank - 1; while (idx >= 0 && ++indices[idx] >= lengths[idx]) { indices[idx] = 0; --idx; } break; } default: reader.ConsumeUnknownField(session, header); break; } } return(result); }