@@ -15,11 +15,14 @@ namespace Dapr.Actors.Communication
15
15
{
16
16
using System ;
17
17
using System . Collections . Concurrent ;
18
+ using System . Collections . Generic ;
19
+ using System . Diagnostics . CodeAnalysis ;
20
+ using System . Linq ;
18
21
using Dapr . Actors . Builder ;
19
22
20
23
internal class ActorMessageSerializersManager
21
24
{
22
- private readonly ConcurrentDictionary < int , CacheEntry > cachedBodySerializers ;
25
+ private readonly ConcurrentDictionary < ( int , string ) , CacheEntry > cachedBodySerializers ;
23
26
private readonly IActorMessageHeaderSerializer headerSerializer ;
24
27
private readonly IActorMessageBodySerializationProvider serializationProvider ;
25
28
@@ -38,7 +41,7 @@ public ActorMessageSerializersManager(
38
41
}
39
42
40
43
this . serializationProvider = serializationProvider ;
41
- this . cachedBodySerializers = new ConcurrentDictionary < int , CacheEntry > ( ) ;
44
+ this . cachedBodySerializers = new ConcurrentDictionary < ( int , string ) , CacheEntry > ( ) ;
42
45
this . headerSerializer = headerSerializer ;
43
46
}
44
47
@@ -52,19 +55,19 @@ public IActorMessageHeaderSerializer GetHeaderSerializer()
52
55
return this . headerSerializer ;
53
56
}
54
57
55
- public IActorRequestMessageBodySerializer GetRequestMessageBodySerializer ( int interfaceId )
58
+ public IActorRequestMessageBodySerializer GetRequestMessageBodySerializer ( int interfaceId , [ AllowNull ] string methodName = null )
56
59
{
57
- return this . cachedBodySerializers . GetOrAdd ( interfaceId , this . CreateSerializers ) . RequestMessageBodySerializer ;
60
+ return this . cachedBodySerializers . GetOrAdd ( ( interfaceId , methodName ) , this . CreateSerializers ) . RequestMessageBodySerializer ;
58
61
}
59
62
60
- public IActorResponseMessageBodySerializer GetResponseMessageBodySerializer ( int interfaceId )
63
+ public IActorResponseMessageBodySerializer GetResponseMessageBodySerializer ( int interfaceId , [ AllowNull ] string methodName = null )
61
64
{
62
- return this . cachedBodySerializers . GetOrAdd ( interfaceId , this . CreateSerializers ) . ResponseMessageBodySerializer ;
65
+ return this . cachedBodySerializers . GetOrAdd ( ( interfaceId , methodName ) , this . CreateSerializers ) . ResponseMessageBodySerializer ;
63
66
}
64
67
65
- internal CacheEntry CreateSerializers ( int interfaceId )
68
+ internal CacheEntry CreateSerializers ( ( int interfaceId , string methodName ) data )
66
69
{
67
- var interfaceDetails = this . GetInterfaceDetails ( interfaceId ) ;
70
+ var interfaceDetails = this . GetInterfaceDetails ( data . interfaceId ) ;
68
71
69
72
// get the service interface type from the code gen layer
70
73
var serviceInterfaceType = interfaceDetails . ServiceInterfaceType ;
@@ -74,10 +77,27 @@ internal CacheEntry CreateSerializers(int interfaceId)
74
77
75
78
// get the known types from the codegen layer
76
79
var responseBodyTypes = interfaceDetails . ResponseKnownTypes ;
80
+ if ( data . methodName is null )
81
+ {
82
+ // Path is mainly used for XML serialization
83
+ return new CacheEntry (
84
+ this . serializationProvider . CreateRequestMessageBodySerializer ( serviceInterfaceType , requestBodyTypes , interfaceDetails . RequestWrappedKnownTypes ) ,
85
+ this . serializationProvider . CreateResponseMessageBodySerializer ( serviceInterfaceType , responseBodyTypes , interfaceDetails . ResponseWrappedKnownTypes ) ) ;
86
+ }
87
+ else
88
+ {
89
+ // This path should be used for JSON serialization
90
+ var requestWrapperTypeAsList = new List < Type > ( 1 ) {
91
+ interfaceDetails . RequestWrappedKnownTypes . Single ( r => r . Name == $ "{ data . methodName } ReqBody")
92
+ } ;
93
+ var responseWrapperTypeAsList = new List < Type > ( 1 ) {
94
+ interfaceDetails . RequestWrappedKnownTypes . Single ( r => r . Name == $ "{ data . methodName } RespBody")
95
+ } ;
96
+ return new CacheEntry (
97
+ this . serializationProvider . CreateRequestMessageBodySerializer ( serviceInterfaceType , requestBodyTypes , requestWrapperTypeAsList ) ,
98
+ this . serializationProvider . CreateResponseMessageBodySerializer ( serviceInterfaceType , responseBodyTypes , responseWrapperTypeAsList ) ) ;
99
+ }
77
100
78
- return new CacheEntry (
79
- this . serializationProvider . CreateRequestMessageBodySerializer ( serviceInterfaceType , requestBodyTypes , interfaceDetails . RequestWrappedKnownTypes ) ,
80
- this . serializationProvider . CreateResponseMessageBodySerializer ( serviceInterfaceType , responseBodyTypes , interfaceDetails . ResponseWrappedKnownTypes ) ) ;
81
101
}
82
102
83
103
internal InterfaceDetails GetInterfaceDetails ( int interfaceId )
0 commit comments