Пример #1
0
        public override bool CanConvert(Type typeToConvert)
        {
            if (!typeof(IMessage).IsAssignableFrom(typeToConvert))
            {
                return(false);
            }

            var descriptor = JsonConverterHelper.GetMessageDescriptor(typeToConvert);

            if (descriptor == null)
            {
                return(false);
            }

            return(JsonConverterHelper.IsWrapperType(descriptor));
        }
Пример #2
0
        public override void Write(Utf8JsonWriter writer, TMessage value, JsonSerializerOptions options)
        {
            var typeUrl    = (string)value.Descriptor.Fields[Any.TypeUrlFieldNumber].Accessor.GetValue(value);
            var data       = (ByteString)value.Descriptor.Fields[Any.ValueFieldNumber].Accessor.GetValue(value);
            var typeName   = Any.GetTypeName(typeUrl);
            var descriptor = _settings.TypeRegistry.Find(typeName);

            if (descriptor == null)
            {
                throw new InvalidOperationException($"Type registry has no descriptor for type name '{typeName}'");
            }
            var valueMessage = descriptor.Parser.ParseFrom(data);

            writer.WriteStartObject();
            writer.WriteString(AnyTypeUrlField, typeUrl);

            if (JsonConverterHelper.IsWellKnownType(descriptor))
            {
                writer.WritePropertyName(AnyWellKnownTypeValueField);
                if (JsonConverterHelper.IsWrapperType(descriptor))
                {
                    var wrappedValue = valueMessage.Descriptor.Fields[JsonConverterHelper.WrapperValueFieldNumber].Accessor.GetValue(valueMessage);
                    JsonSerializer.Serialize(writer, wrappedValue, wrappedValue.GetType(), options);
                }
                else
                {
                    JsonSerializer.Serialize(writer, valueMessage, valueMessage.GetType(), options);
                }
            }
            else
            {
                MessageConverter <Any> .WriteMessageFields(writer, valueMessage, _settings, options);
            }

            writer.WriteEndObject();
        }