@@ -13,7 +13,11 @@ namespace System.Text.Json.Protobuf;
1313
1414 public ProtobufConverter ( JsonNamingPolicy ? namingPolicy , JsonProtobufSerializerOptions options )
1515 {
16- var propertyInfo = typeof ( T ) . GetProperty ( "Descriptor" , BindingFlags . Public | BindingFlags . Static ) ;
16+ var type = typeof ( T ) ;
17+
18+ var propertyTypeLookup = type . GetProperties ( ) . ToDictionary ( x => x . Name , x => x . PropertyType ) ;
19+
20+ var propertyInfo = type . GetProperty ( "Descriptor" , BindingFlags . Public | BindingFlags . Static ) ;
1721 var messageDescriptor = ( MessageDescriptor ) propertyInfo ? . GetValue ( null , null ) ! ;
1822
1923 var convertNameFunc = GetConvertNameFunc ( namingPolicy , options . UseProtobufJsonNames ) ;
@@ -22,7 +26,8 @@ public ProtobufConverter(JsonNamingPolicy? namingPolicy, JsonProtobufSerializerO
2226 {
2327 Accessor = fieldDescriptor . Accessor ,
2428 IsRepeated = fieldDescriptor . IsRepeated ,
25- FieldType = GetFieldType ( fieldDescriptor ) ,
29+ IsMap = fieldDescriptor . IsMap ,
30+ FieldType = GetFieldType ( fieldDescriptor , propertyTypeLookup ) ,
2631 JsonName = convertNameFunc ( fieldDescriptor ) ,
2732 IsOneOf = fieldDescriptor . ContainingOneof != null
2833 } ) . ToArray ( ) ;
@@ -72,7 +77,7 @@ public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerial
7277 continue ;
7378 }
7479
75- fieldInfo . Converter ??= InternalConverterFactory . Create ( fieldInfo . FieldType , fieldInfo . IsRepeated ) ;
80+ fieldInfo . Converter ??= InternalConverterFactory . Create ( fieldInfo ) ;
7681
7782 reader . Read ( ) ;
7883 fieldInfo . Converter . Read ( ref reader , obj , fieldInfo . FieldType , options , fieldInfo . Accessor ) ;
@@ -102,17 +107,17 @@ public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOption
102107 if ( obj is { } propertyValue )
103108 {
104109 writer . WritePropertyName ( fieldInfo . JsonName ) ;
105- fieldInfo . Converter ??= InternalConverterFactory . Create ( fieldInfo . FieldType , fieldInfo . IsRepeated ) ;
110+ fieldInfo . Converter ??= InternalConverterFactory . Create ( fieldInfo ) ;
106111 fieldInfo . Converter . Write ( writer , propertyValue , options ) ;
107112 }
108113 }
109114
110115 writer . WriteEndObject ( ) ;
111116 }
112117
113- private Type GetFieldType ( FieldDescriptor fieldType )
118+ private Type GetFieldType ( FieldDescriptor fieldDescriptor , Dictionary < string , Type > propertyTypeLookup )
114119 {
115- switch ( fieldType . FieldType )
120+ switch ( fieldDescriptor . FieldType )
116121 {
117122 case FieldType . Double :
118123 return typeof ( double ) ;
@@ -136,10 +141,12 @@ private Type GetFieldType(FieldDescriptor fieldType)
136141 return typeof ( bool ) ;
137142 case FieldType . String :
138143 return typeof ( string ) ;
144+ case FieldType . Message when fieldDescriptor . MessageType . ClrType != null :
145+ return fieldDescriptor . MessageType . ClrType ;
139146 case FieldType . Message :
140- return fieldType . MessageType . ClrType ;
147+ return propertyTypeLookup [ fieldDescriptor . PropertyName ] ;
141148 default :
142- throw new ArgumentOutOfRangeException ( nameof ( fieldType ) , $ "FieldType: '{ fieldType } ' is not supported.") ;
149+ throw new ArgumentOutOfRangeException ( nameof ( fieldDescriptor ) , $ "FieldType: '{ fieldDescriptor } ' is not supported.") ;
143150 }
144151 }
145152}
0 commit comments