@@ -53,10 +53,12 @@ public partial class MrwSerializationTypeDefinition : TypeProvider
5353 private readonly ScopedApi < ModelReaderWriterOptions > _mrwOptionsParameterSnippet ;
5454 private readonly ScopedApi < JsonElement > _jsonElementParameterSnippet ;
5555 private readonly ScopedApi < bool > _isNotEqualToWireConditionSnippet ;
56- private readonly CSharpType _jsonModelTInterface ;
57- private readonly CSharpType ? _jsonModelObjectInterface ;
58- private readonly CSharpType _persistableModelTInterface ;
59- private readonly CSharpType ? _persistableModelObjectInterface ;
56+ private CSharpType ? _jsonModelTInterfaceValue ;
57+ private CSharpType _jsonModelTInterface => _jsonModelTInterfaceValue ??= new CSharpType ( typeof ( IJsonModel < > ) , SerializationInterfaceType . Type ) ;
58+ private CSharpType ? _jsonModelObjectInterface => _isStruct ? ( CSharpType ) typeof ( IJsonModel < object > ) : null ;
59+ private CSharpType ? _persistableModelTInterfaceValue ;
60+ private CSharpType _persistableModelTInterface => _persistableModelTInterfaceValue ??= new CSharpType ( typeof ( IPersistableModel < > ) , SerializationInterfaceType . Type ) ;
61+ private CSharpType ? _persistableModelObjectInterface => _isStruct ? ( CSharpType ) typeof ( IPersistableModel < object > ) : null ;
6062 private readonly ModelProvider _model ;
6163 private readonly InputModelType _inputModel ;
6264 private readonly FieldProvider ? _rawDataField ;
@@ -67,10 +69,16 @@ public partial class MrwSerializationTypeDefinition : TypeProvider
6769 private readonly bool _supportsXml ;
6870 private ConstructorProvider ? _serializationConstructor ;
6971 // Flag to determine if the model should override the serialization methods
70- private readonly bool _shouldOverrideMethods ;
71- private readonly bool _shouldSkipDerivedSerializationMethodOverrides ;
72+ private bool ShouldOverrideMethods => _model . BaseModelProvider != null && ! _isStruct ;
73+ private bool ShouldSkipSerializationMethodOverrides => ShouldSkipDerivedSerializationMethodOverrides ( _model . BaseModelProvider ) ;
74+ private readonly bool _shouldOverrideXmlMethods ;
7275 private readonly Lazy < PropertyProvider [ ] > _additionalProperties ;
7376
77+ private TypeProvider SerializationInterfaceType => _serializationInterfaceType ??= _inputModel . IsUnknownDiscriminatorModel
78+ ? ScmCodeModelGenerator . Instance . TypeFactory . CreateModel ( _inputModel . BaseModel ! ) !
79+ : _model ;
80+ private TypeProvider ? _serializationInterfaceType ;
81+
7482 private CSharpType RootType => _rootType ??= GetRootModelType ( ) ;
7583 private CSharpType ? _rootType ;
7684
@@ -84,17 +92,10 @@ public MrwSerializationTypeDefinition(InputModelType inputModel, ModelProvider m
8492 _isStruct = _model . DeclarationModifiers . HasFlag ( TypeSignatureModifiers . Struct ) ;
8593 _supportsXml = inputModel . Usage . HasFlag ( InputModelTypeUsage . Xml ) ;
8694 _supportsJson = inputModel . Usage . HasFlag ( InputModelTypeUsage . Json ) || ! _supportsXml ;
87- // Initialize the serialization interfaces
88- var interfaceType = inputModel . IsUnknownDiscriminatorModel ? ScmCodeModelGenerator . Instance . TypeFactory . CreateModel ( inputModel . BaseModel ! ) ! : _model ;
89- _jsonModelTInterface = new CSharpType ( typeof ( IJsonModel < > ) , interfaceType . Type ) ;
90- _jsonModelObjectInterface = _isStruct ? ( CSharpType ) typeof ( IJsonModel < object > ) : null ;
91- _persistableModelTInterface = new CSharpType ( typeof ( IPersistableModel < > ) , interfaceType . Type ) ;
92- _persistableModelObjectInterface = _isStruct ? ( CSharpType ) typeof ( IPersistableModel < object > ) : null ;
95+ _shouldOverrideXmlMethods = _model . BaseModelProvider != null && ! _isStruct ;
9396 _rawDataField = _model . Fields . FirstOrDefault ( f => f . Name == AdditionalPropertiesHelper . AdditionalBinaryDataPropsFieldName ) ;
9497 _additionalBinaryDataProperty = new ( GetAdditionalBinaryDataPropertiesProp ) ;
9598 _additionalProperties = new ( ( ) => [ .. _model . Properties . Where ( p => p . IsAdditionalProperties ) ] ) ;
96- _shouldOverrideMethods = _model . BaseModelProvider != null && ! _isStruct ;
97- _shouldSkipDerivedSerializationMethodOverrides = ShouldSkipDerivedSerializationMethodOverrides ( _model . BaseModelProvider ) ;
9899 _utf8JsonWriterSnippet = _utf8JsonWriterParameter . As < Utf8JsonWriter > ( ) ;
99100 _mrwOptionsParameterSnippet = _serializationOptionsParameter . As < ModelReaderWriterOptions > ( ) ;
100101 _jsonElementParameterSnippet = _jsonElementDeserializationParam . As < JsonElement > ( ) ;
@@ -530,7 +531,7 @@ internal MethodProvider BuildJsonModelWriteCoreMethod()
530531 MethodSignatureModifiers modifiers = _isStruct
531532 ? MethodSignatureModifiers . Private
532533 : MethodSignatureModifiers . Protected | MethodSignatureModifiers . Virtual ;
533- if ( _shouldOverrideMethods )
534+ if ( ShouldOverrideMethods )
534535 {
535536 modifiers = MethodSignatureModifiers . Protected | MethodSignatureModifiers . Override ;
536537 }
@@ -552,7 +553,7 @@ internal MethodProvider BuildPersistableModelWriteCoreMethod()
552553 ? MethodSignatureModifiers . Private
553554 : MethodSignatureModifiers . Protected | MethodSignatureModifiers . Virtual ;
554555
555- if ( _shouldOverrideMethods && ! _shouldSkipDerivedSerializationMethodOverrides )
556+ if ( ShouldOverrideMethods && ! ShouldSkipSerializationMethodOverrides )
556557 {
557558 modifiers = MethodSignatureModifiers . Protected | MethodSignatureModifiers . Override ;
558559 }
@@ -576,7 +577,7 @@ internal MethodProvider BuildPersistableModelCreateCoreMethod()
576577 ? MethodSignatureModifiers . Private
577578 : MethodSignatureModifiers . Protected | MethodSignatureModifiers . Virtual ;
578579
579- if ( _shouldOverrideMethods && ! _shouldSkipDerivedSerializationMethodOverrides )
580+ if ( ShouldOverrideMethods && ! ShouldSkipSerializationMethodOverrides )
580581 {
581582 modifiers = MethodSignatureModifiers . Protected | MethodSignatureModifiers . Override ;
582583 }
@@ -624,7 +625,7 @@ internal MethodProvider BuildJsonModelCreateCoreMethod()
624625 ? MethodSignatureModifiers . Private
625626 : MethodSignatureModifiers . Protected | MethodSignatureModifiers . Virtual ;
626627
627- if ( _shouldOverrideMethods && ! _shouldSkipDerivedSerializationMethodOverrides )
628+ if ( ShouldOverrideMethods && ! ShouldSkipSerializationMethodOverrides )
628629 {
629630 modifiers = MethodSignatureModifiers . Protected | MethodSignatureModifiers . Override ;
630631 }
@@ -1055,7 +1056,7 @@ private MethodBodyStatement[] BuildPersistableModelCreateCoreMethodBody()
10551056 private MethodBodyStatement CallBaseJsonModelWriteCore ( bool isDynamicModelWithNonDynamicBase )
10561057 {
10571058 // base.<JsonModelWriteCore>()
1058- bool callBaseWriteMethod = _shouldOverrideMethods
1059+ bool callBaseWriteMethod = ShouldOverrideMethods
10591060 && ( _jsonPatchProperty is null || ! isDynamicModelWithNonDynamicBase ) ;
10601061 return callBaseWriteMethod ?
10611062 Base . Invoke ( JsonModelWriteCoreMethodName , [ _utf8JsonWriterParameter , _serializationOptionsParameter ] ) . Terminate ( )
0 commit comments