ServiceStack JSON 序列化程序:如何全局更改默认序列化程序?

ServiceStack JSON serializer: How can I change the default serializer globally?

我有一个案例,其中 ServiceStack JSON 序列化程序无法反序列化,而 Newtonsoft 的 JSON.NET 设法做到了。我还没有找到用 JSON.NET 替换默认序列化程序的明确方法,因此它是全局的,并且适用于所有 classes.

JsConfig<T>.SerializeFn 我想可行,但它是根据 class,我想要全球所有 classes。

我该怎么做?

背景

我正在使用 ServiceStack.Messaging.Redis 和 Redis 作为 MQ 解决方案。我们使用这种方法发送消息:

using (var mqClient = MqClientFactory.Instance.CreateMessageQueueClient())
{

    var uniqueCallbackQ = "mq:c1" + ":" + Guid.NewGuid().ToString("N");
    var clientMsg = new Message<TRequest>(request)
    {
        ReplyTo = uniqueCallbackQ
    };

    mqClient.Publish(clientMsg);
    //Blocks thread on client until reply message is received
    responseMessage = mqClient.Get<TResponse>(uniqueCallbackQ, timeout);
}

以及用于接收消息的标准内容:

redisMqServer.RegisterHandler<TheRequest>(base.ExecuteMessage);

简化,我有一个包含 public object Result {get; set;} 的请求 class,并且此 属性 在 ServiceStack 中被反序列化为 Dictionary<string, object>,而不是正确的类型.

我很清楚使用强类型对象的建议,但我的问题是我们实际上不是在处理用于外部通信的干净 DTO,而是内部对象的内部通信,严重依赖多态性及其遗留代码,我们现在没有创造新东西。

因此,在某些情况下,我们拥有“对象”属性,并且无法使用 ServiceStack 对其进行反序列化。类型信息在那里,所以我认为它会起作用,但它没有(为清楚起见,我删除了下面的命名空间):

string ssJson = ServiceStack.Text.JsonSerializer.SerializeToString(getTextMessageTemplateObject);

// above produces: 

{
    "_Type": "Deviation",
    "Result": [{
            "__type": "TextMessageTemplate, AlfaCommons",
            "_Message": "test",
            "_Type": "Deviation",
        }
    ],
    "Success": true,
}

// And then, deserialize the json above:

GetTextMessageTemplate ssGetTextMessageTemplate = ServiceStack.Text.JsonSerializer.DeserializeFromString< 
GetTextMessageTemplate>(ssJson);

这是 ssGetTextMessageTemplate(请注意,为清楚起见,我删除了一些属性):

Result prop 没有正确反序列化,如上所示。

使用JSON.NET时,序列化后的JSON为:

{
    "$type": "GetTextMessageTemplate, AlfaCommons",
    "_Type": 4,
    "Result": {
        "$type": "System.Collections.Generic.List`1[[TextMessageTemplate, AlfaCommons]], System.Private.CoreLib",
        "$values": [{
                "$type": "TextMessageTemplate, AlfaCommons",
                "_Message": "test",
                "_Type": 4,
            }
        ]
    }
}

反序列化后,它按预期工作:

所以,我想尝试在上述情况下使用 JSON.NET 序列化程序。

ServiceStack.Redis 的对象序列化严重依赖 ServiceStack.Text,它不支持使用替代 JSON Serailizer 的全局替换。

在消息中发送任意负载的一种解决方法是在 string Result 属性 中发送序列化 JSON,您可以使用 JSON.NET 到 de/serialize.

另一个可能的解决方法是使用 FromObjectDictionary Reflection Utils 将对象字典转换回类型化的 DTO,例如:

var result = objDictionary.FromObjectDictionary(theResultType);