private static object DeserializeFromMarker( ref Reader reader, SerializerSession session, Field field, UnknownFieldMarker marker, uint reference, Type lastResortFieldType) { // Create a reader at the position specified by the marker. var referencedReader = reader.ForkFrom(marker.Position); // Determine the correct type for the field. var fieldType = marker.Field.FieldType ?? field.FieldType ?? lastResortFieldType; // Get a serializer for that type. var specificSerializer = session.CodecProvider.GetCodec(fieldType); // Reset the session's reference id so that the deserialized object overwrites the marker. var originalCurrentReferenceId = session.ReferencedObjects.CurrentReferenceId; session.ReferencedObjects.CurrentReferenceId = reference - 1; // Deserialize the object, replacing the marker in the session. try { return(specificSerializer.ReadValue(ref referencedReader, session, marker.Field)); } finally { // Revert the reference id. session.ReferencedObjects.CurrentReferenceId = originalCurrentReferenceId; } }
public static object ReadReference <TInput>(ref Reader <TInput> reader, Field field, Type expectedType) { MarkValueField(reader.Session); var reference = reader.ReadVarUInt32(); if (!reader.Session.ReferencedObjects.TryGetReferencedObject(reference, out var value)) { ThrowReferenceNotFound(expectedType, reference); } return(value switch { UnknownFieldMarker marker => DeserializeFromMarker(ref reader, field, marker, reference, expectedType), _ => value, });