我正在使用Java开发服务器端服务。当用户连接到该服务时,将打开一个新会话。然后,用户通过发送JSON消息与服务进行通信:
{
type: A,
body: {
...
}
}
" type"定义1:1特定POJO应该" body"被反序列化为。
到目前为止,这么简单。当然。将一个枚举给另一个的枚举应该足够了。问题是......然后我需要将这样一个反序列化的POJO传递给用户的会话进行处理。会话是有状态的,有许多可能的状态,每个州都知道如何只处理它自己的几条特定消息。我成功地解决了#34;这个问题:
interface MessageType<TConsumer> {
Combo<?, TConsumer> combo();
}
class Combo<T, TConsumer> {
private final Class<T> clazz;
private final BiConsumer<TConsumer, T> biConsumer;
...
// accessors
}
class Wombo<T, Tconsumer> {
private final T body;
private final BiConsumer<TConsumer, T> biConsumer;
void consume(TConsumer consumeBy) {
...
}
}
其中:
T - 是邮件正文的类型
TConsumer - 是一个会话状态,它知道如何只处理特定的消息体
MessageType - 是由枚举实现的接口,它知道在哪些特定会话状态中允许哪些特定的消息体。如果我们处于给定的状态并且给定的消息进入 - 我们应该如何处理它。每个会话状态都拥有它自己的枚举。
Combo - 是一个帮助类,我们将原始json传递给反序列化器,从而产生一个Wombo实例。
Wombo - 它正在持有消息体,并且在我们传递会话状态的实例时知道如何处理它。
p p ......这似乎是一种荒谬的过度工程(不可思议的复杂),因为我认为这是一种非常普遍的商业需求。TLDR:根据另一个对象的上下文,Java中是否存在将JSON反序列化为POJO的惯用方法?然后以类型安全的方式在上述环境中处理所述POJO?
先谢谢你们! :)
P.S。在我看来,如果Java允许参数化枚举,这将是相当简单的。那么,也许在这里使用枚举是它自己的设计错误?
答案 0 :(得分:0)
我知道将Object序列化为JSON并将JSON反序列化为Object的最佳方法是使用Gson。这是该工作的好工具