public object[] Deserialize(Stream stream, IList<Type> messageTypes)
{
Guard.AgainstNull(nameof(stream), stream);
var settings = serializerSettings;
var mostConcreteType = messageTypes?.FirstOrDefault();
var requiresDynamicDeserialization = mostConcreteType != null && mostConcreteType.IsInterface;
if (requiresDynamicDeserialization)
{
settings = new JsonSerializerSettings
{
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple,
TypeNameHandling = TypeNameHandling.None,
Converters =
{
new XContainerJsonConverter()
}
};
}
var jsonSerializer = Newtonsoft.Json.JsonSerializer.Create(settings);
jsonSerializer.ContractResolver = messageContractResolver;
jsonSerializer.Binder = new JsonMessageSerializationBinder(messageMapper, messageTypes);
var reader = CreateJsonReader(stream);
reader.Read();
var firstTokenType = reader.TokenType;
if (firstTokenType == JsonToken.StartArray)
{
if (requiresDynamicDeserialization)
{
//We can safely use the first type on the list to create an array because multi-message Publish requires messages to be of same type.
return (object[]) jsonSerializer.Deserialize(reader, mostConcreteType.MakeArrayType());
}
return jsonSerializer.Deserialize<object[]>(reader);
}
if (messageTypes != null && messageTypes.Any())
{
var rootTypes = FindRootTypes(messageTypes);
return rootTypes.Select(x =>
{
if (reader == null)
{
stream.Seek(0, SeekOrigin.Begin);
reader = CreateJsonReader(stream);
reader.Read();
}
var deserialized = jsonSerializer.Deserialize(reader, x);
reader = null;
return deserialized;
}).ToArray();
}
return new[]
{
jsonSerializer.Deserialize<object>(reader)
};
}