Serialização do parâmetro do método hub SignalR

Eu precisaria de algumas diretrizes dos desenvolvedores SignalR, qual é a melhor maneira de ajustar a serialização de parâmetros do método HUB.

Eu comecei a migrar meu projeto do duplex de pesquisa do WCF (Silverlight 5 - ASP.NET 4.5) para SignalR (1.1.2). A mensagem (contrato de dados) é polimórfica baseada em interfaces. (Como IMessage, MessageA: IMessage, etc. - existe, na verdade, hierarquia de interfaces implementadas por classes, mas não é muito significativa para a questão). (Eu sei que objetos polimórficos não são bons para clientes, mas o cliente vai lidar com isso como JSON e o mapeamento para objetos é feito apenas no lado do servidor ou cliente, se for .NET / Silverlight).

No hub eu defini o método assim:

public void SendMessage(IMessage data) { .. }

Criei JsonConverters personalizados e verifiquei se as mensagens poderiam ser serializadas / desserializadas usando o Json.NET. Então substituí o JsonNetSerializer em DependencyResolver pelas configurações adequadas. Da mesma forma no lado do cliente do Silverlight. Por enquanto, tudo bem.

Mas quando enviei a mensagem do cliente para o servidor (a mensagem foi serializada para JSON corretamente - verificada no Fiddler), o servidor retornou um erro de que o parâmetro não pode ser desserializado. Com a ajuda do depurador, encontrei um bug no SignalR (a classe JRawValue responsável pela desserialização do parâmetro cria internamente sua própria instância do JsonSerializer, ignorando o fornecido). Parecia ser bastante fácil, substituindo

var settings = new JsonSerializerSettings
{
    MaxDepth = 20
};
var serializer = JsonSerializer.Create(settings);
return serializer.Deserialize(jsonReader, type);

com

var serializer = GlobalHost.DependencyResolver.Resolve<IJsonSerializer>();
return serializer.Parse(jsonReader, type);

mas também descobri que a interface IJsonSerializer será removida na versão futura do SignalR. O que eu preciso, basicamente, é obter JSON bruto (ou fluxo de bytes) do método HUB para que eu possa desserializá-lo sozinho ou a possibilidade de ajustar o serializador especificando conversores, etc.

Por enquanto acabei definindo o método com o tipo de parâmetro JObject:

public void SendMessage(JObject data)

seguido de desserialização manual de dados usando

JObject.ToObject<IMessage>(JsonSerializer)

método. Mas eu preferiria personalizar o serializador e ter o tipo / interface no método do hub. Qual é o "caminho certo" para fazê-lo em relação ao design do próximo SignalR?

Também achei útil ter a possibilidade de enviar de volta aos clientes JSON bruto do meu código, ou seja, para que o objeto não seja serializado novamente pelo SignalR novamente. Como eu poderia conseguir isso?

questionAnswers(1)

yourAnswerToTheQuestion