【发布时间】:2021-08-11 19:08:57
【问题描述】:
我正在开发一个 websocket 客户端应用程序。服务器以 JSON 格式发送消息,我想反序列化它。 JSON格式数据中有一个字符串表示消息的类型(今天大约有50种,以后可能会更多)。
所以我写了一个像这样的大型 switch 语句:
switch(type){
case "type1":
DoSth<T1>(DeserializeFunction<T1>(message));
break;
case "type2":
DoSth<T2>(DeserializeFunction<T2>(message));
break;
//...
}
这个语句可以优化吗?
这是模型:
public record EventMessage<T> where T : IEventExtraBody
{
// this will always be 0
[JsonPropertyName("s")]
public int EventType { get; set; }
[JsonPropertyName("sn")]
public long SerialNumber { get; set; }
[JsonPropertyName("d")]
public EventMessageData<T> Data { get; set; }
public override string ToString()
{
return JsonSerializer.Serialize(this);
}
}
public record EventMessageData<T> where T : IEventExtraBody
{
// Some other properties
[JsonPropertyName("extra")]
public EventMessageExtra<T> Extra { get; set; }
}
public record EventMessageExtra<T> where T : IEventExtraBody
{
[JsonPropertyName("type")]
public string Type { get; set; } // this string indicates the type of message
[JsonPropertyName("body")]
public T Body { get; set; }
}
正文(示例):
public record ExitedGuildEvent : IEventExtraBody
{
[JsonPropertyName("user_id")]
public string UserId { get; set; }
[JsonPropertyName("exited_at")]
public long ExitedAt { get; set; }
}
当消息到达时,我使用JsonDocument 来获取类型字符串。
var typeString = JsonDocument.Parse(message.Text).RootElement.GetProperty("d").GetProperty("extra").GetProperty("type").GetString()
然后,我想反序列化消息并发布到MessageHub。
反序列化json字符串并发布:
_messageHub.Publish(JsonSerializer.Deserialize<EventMessage<BodyType>>(message.Text));
而且因为BodyType很多,而EventMessage<Type.GetType("TypeClassPath")>(message.Text)是非法的,所以我写了一个大的switch语句。
也许我为这种情况建立了一个非常糟糕的模型。希望大家多多指教。
【问题讨论】:
-
需要更多信息,因为它没有最少的代码来可视化问题。
-
你知道 SignalR 是基于 WebSockets 的,它为你做这一切就像变魔术一样。
-
如果你使用分层 switch 语句,你将达到 Log(n) 时间复杂度而不是 O(n)
标签: c# .net optimization