1
- using System . Globalization ;
1
+ using System ;
2
+ using System . Globalization ;
2
3
using System . IO ;
3
4
using System . Runtime . Serialization . Formatters ;
5
+ using Newtonsoft . Json ;
6
+ using Newtonsoft . Json . Converters ;
4
7
using NServiceBus . MessageInterfaces ;
5
8
using NServiceBus . Serialization ;
6
9
using NServiceBus . Serializers . Json . Internal ;
7
- using Newtonsoft . Json ;
8
- using Newtonsoft . Json . Converters ;
9
10
10
11
namespace NServiceBus . Serializers . Json
11
12
{
12
13
public abstract class JsonMessageSerializerBase : IMessageSerializer
13
14
{
15
+ // From v4+ we just look for it, but don't expect it
16
+ const string EnclosedMessageTypes = "NServiceBus.EnclosedMessageTypes" ;
17
+
14
18
private readonly IMessageMapper _messageMapper ;
15
19
16
20
protected JsonMessageSerializerBase ( IMessageMapper messageMapper )
@@ -26,7 +30,7 @@ public JsonSerializerSettings JsonSerializerSettings
26
30
{
27
31
TypeNameAssemblyFormat = FormatterAssemblyStyle . Simple ,
28
32
TypeNameHandling = TypeNameHandling . Auto ,
29
- Converters = { new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles . RoundtripKind } }
33
+ Converters = { new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles . RoundtripKind } }
30
34
} ;
31
35
return serializerSettings ;
32
36
}
@@ -49,6 +53,23 @@ public object[] Deserialize(Stream stream)
49
53
jsonSerializer . ContractResolver = new MessageContractResolver ( _messageMapper ) ;
50
54
51
55
JsonReader reader = CreateJsonReader ( stream ) ;
56
+ reader . Read ( ) ;
57
+
58
+ JsonToken firstTokenType = reader . TokenType ;
59
+
60
+ if ( firstTokenType != JsonToken . StartArray )
61
+ {
62
+ string messageTypes ;
63
+
64
+ var bus = Configure . Instance . Builder . Build < IBus > ( ) ;
65
+ if ( bus != null &&
66
+ bus . CurrentMessageContext != null &&
67
+ bus . CurrentMessageContext . Headers != null &&
68
+ bus . CurrentMessageContext . Headers . TryGetValue ( EnclosedMessageTypes , out messageTypes ) )
69
+ {
70
+ return new [ ] { jsonSerializer . Deserialize ( reader , Type . GetType ( messageTypes . Split ( ';' ) [ 0 ] ) ) } ;
71
+ }
72
+ }
52
73
53
74
return jsonSerializer . Deserialize < object [ ] > ( reader ) ;
54
75
}
0 commit comments