8

アプリケーション レイヤー全体で一貫したシリアル化を実現するために、他の場所で使用するものと同じシリアル化ライブラリ (ServiceStack.Text) を SignalR に使用したいと考えています。

使用されている JSON シリアライザーを置き換えるための SignalR の Wikiエントリをたどりながら、次の基本的なハンドラーを作成しました。

public class SignalrServiceStackJsonSerializer : IJsonSerializer
{
    public void Serialize(object value, TextWriter writer)
    {
        var selfSerializer = value as IJsonWritable;
        if (selfSerializer != null)
            selfSerializer.WriteJson(writer);
        else
            JsonSerializer.SerializeToWriter(value, writer);
    }

    public object Parse(TextReader reader, Type targetType)
    {
        return JsonSerializer.DeserializeFromReader(reader, targetType);
    }
}

統合:

var serializer = new SignalrServiceStackJsonSerializer();
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);

残念ながら、統合後、SignalR JS クライアントは既定のシリアライザーとは異なるパッケージを取得します。ご覧のとおり、デフォルトのシリアライザーは (少なくとも非ユーザー メッセージの場合) プロパティが 1 文字に制限された JSON を生成しますが、これは ServiceStack.Text に置き換えた後は発生しません。したがって、SignalR は 'I' にアクセスしようとしますが、'Id' を受け取りました。SignalR サーバー側ソースコードのそれぞれの部分を見つけることができませんでした。

何か間違ったことをしたのでしょうか、それとも ServiceStack.Text を JSON シリアライザーとして使用するには、より複雑なラッパーを作成する必要がありますか?

4

1 に答える 1