@@ -149,18 +149,18 @@ public override void WriteJson(JsonWriter writer, Hashtable value, JsonSerialize
149149 // Convert types if needed
150150 if ( key != null )
151151 {
152- if ( keyPrimitiveType . HasValue )
153- key = ConvertValueFromPrimitiveType ( key , keyPrimitiveType . Value ) ;
154- else if ( keyTypeName != null )
152+ if ( keyTypeName != null )
155153 key = ConvertValueOptimized ( key , keyTypeName ) ;
154+ else if ( keyPrimitiveType . HasValue )
155+ key = ConvertValueFromPrimitiveType ( key , keyPrimitiveType . Value ) ;
156156 }
157157
158158 if ( value != null )
159159 {
160- if ( valuePrimitiveType . HasValue )
161- value = ConvertValueFromPrimitiveType ( value , valuePrimitiveType . Value ) ;
162- else if ( valueTypeName != null )
160+ if ( valueTypeName != null )
163161 value = ConvertValueOptimized ( value , valueTypeName ) ;
162+ else if ( valuePrimitiveType . HasValue )
163+ value = ConvertValueFromPrimitiveType ( value , valuePrimitiveType . Value ) ;
164164 }
165165
166166 return ( key , value ) ;
@@ -180,7 +180,7 @@ private void WriteEntryOptimized(JsonWriter writer, object key, object value, Js
180180 if ( keyType != null )
181181 {
182182 var keyPrimitiveType = GetPrimitiveType ( keyType ) ;
183- if ( keyPrimitiveType != PrimitiveType . Complex )
183+ if ( keyPrimitiveType != PrimitiveType . Complex && keyPrimitiveType != PrimitiveType . Enum )
184184 {
185185 writer . WritePropertyName ( "KP" ) ;
186186 writer . WriteValue ( ( byte ) keyPrimitiveType ) ;
@@ -199,7 +199,7 @@ private void WriteEntryOptimized(JsonWriter writer, object key, object value, Js
199199 if ( valueType != null )
200200 {
201201 var valuePrimitiveType = GetPrimitiveType ( valueType ) ;
202- if ( valuePrimitiveType != PrimitiveType . Complex )
202+ if ( valuePrimitiveType != PrimitiveType . Complex && valuePrimitiveType != PrimitiveType . Enum )
203203 {
204204 writer . WritePropertyName ( "VP" ) ;
205205 writer . WriteValue ( ( byte ) valuePrimitiveType ) ;
@@ -257,6 +257,11 @@ private object ConvertValueFromPrimitiveType(object value, PrimitiveType primiti
257257 return Convert . ToUInt32 ( value ) ;
258258 case PrimitiveType . UInt64 :
259259 return Convert . ToUInt64 ( value ) ;
260+ case PrimitiveType . Enum :
261+ // For enums, we need the type information from VT field
262+ // This method is called when we have primitive type info only
263+ // So we can't handle enum conversion here without type info
264+ return value ;
260265 default :
261266 return value ;
262267 }
@@ -310,6 +315,8 @@ private object ConvertValueOptimized(object value, string typeName)
310315 return Convert . ToUInt32 ( value ) ;
311316 case PrimitiveType . UInt64 :
312317 return Convert . ToUInt64 ( value ) ;
318+ case PrimitiveType . Enum :
319+ return Enum . ToObject ( targetType , value ) ;
313320 default :
314321 // For complex types, return as-is since they should already be deserialized correctly
315322 return value ;
@@ -328,9 +335,9 @@ private string GetTypeNameCached(Type type)
328335 {
329336 var sb = _stringBuilder . Value ;
330337 sb . Clear ( ) ;
331- sb . Append ( t . Assembly . GetName ( ) . Name ) ;
332- sb . Append ( ", " ) ;
333338 sb . Append ( t . FullName ) ;
339+ sb . Append ( ", " ) ;
340+ sb . Append ( t . Assembly . GetName ( ) . Name ) ;
334341 return sb . ToString ( ) ;
335342 } ) ;
336343 }
@@ -371,6 +378,7 @@ private PrimitiveType GetPrimitiveType(Type type)
371378 if ( t == typeof ( ushort ) ) return PrimitiveType . UInt16 ;
372379 if ( t == typeof ( uint ) ) return PrimitiveType . UInt32 ;
373380 if ( t == typeof ( ulong ) ) return PrimitiveType . UInt64 ;
381+ if ( t . IsEnum ) return PrimitiveType . Enum ;
374382 return PrimitiveType . Complex ;
375383 } ) ;
376384 }
0 commit comments