Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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,
            });