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);
我有一个案例,其中 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);