Esempio n. 1
0
        private IEnumerable <(A, B)> EnumerateTuples(BsonDeserializationContext context, BsonDeserializationArgs args)
        {
            var reader = context.Reader;

            var keyDeserializationArgs   = ArgumentHelper.GetSpecificDeserializationArgs(args);
            var valueDeserializationArgs = ArgumentHelper.GetSpecificDeserializationArgs(args, 1);

            reader.ReadStartArray();

            while (reader.ReadBsonType() != BsonType.EndOfDocument)
            {
                A key   = default;
                B value = default;

                var keySet   = false;
                var valueSet = false;

                reader.ReadStartDocument();
                while (reader.ReadBsonType() != BsonType.EndOfDocument)
                {
                    var elementName = reader.ReadName();
                    switch (elementName)
                    {
                    case Key:
                        keySet = true;
                        key    = _keySerializer.Deserialize(context, keyDeserializationArgs);
                        break;

                    case Value:
                        valueSet = true;
                        value    = _valueSerializer.Deserialize(context, valueDeserializationArgs);
                        break;

                    default:
                        throw new BsonSerializationException($"Unknown element name {elementName}");
                    }
                }

                reader.ReadEndDocument();

                if (!keySet)
                {
                    throw new BsonSerializationException("Missing key");
                }

                if (!valueSet)
                {
                    throw new BsonSerializationException("Missing value");
                }

                yield return(key, value);
            }

            reader.ReadEndArray();
        }
Esempio n. 2
0
 private static BsonDeserializationArgs GetValueDeserializationArgs(BsonDeserializationArgs args)
 => ArgumentHelper.GetSpecificDeserializationArgs(args, 1);
Esempio n. 3
0
 private static BsonDeserializationArgs GetItemDeserializationArgs(BsonDeserializationArgs optionArgs)
 => ArgumentHelper.GetSpecificDeserializationArgs(optionArgs);