2016-12-09 1 views
0

私はJavaでサーバー側サービスを開発中です。ユーザーがサービスに接続すると、新しいセッションが開きます。コンパイル時にJSONを不明な型のPOJOに逆シリアル化するための慣用句

{ 
    type: A, 
    body: { 
     ... 
    } 
} 

「タイプ」は1定義:POJOが「本体」がデシリアライズすべき特定の1その後、ユーザは、JSONメッセージを送信することによりサービスと通信します。

これまでのところ、とても単純です。確かに。一方を他方に割り当てるenumで十分です。問題は...私は、そのような非直列化POJOを処理のためにユーザのSessionに渡す必要があります。セッションはステートフルであり、多くの可能な状態があり、すべての州ではそれ自体の特定のメッセージしか処理しない方法を知っています。

私はこの問題を "解決" するために管理:

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 - enumsによって実装されるインターフェースで、特定のsessio n州。私たちが与えられた時代にいて、与えられたメッセージが来たら、私たちはそれと何をすべきですか?すべてのセッション状態は、それ自身のenumを持っています。

コンボ - 生のjsonをデシリアライザに渡して、結果的にWomboのインスタンスを生成するヘルパークラスです。

Wombo - メッセージボディを保持し、セッションステートのインスタンスを渡すときにそれを処理する方法を知っています。

Phew ...これは非常に一般的なビジネスニーズであると私が推測するもののために、ばかげて過度に強化されているように見えます(a.k.a.不要な複雑さ)。

TLDR:別のオブジェクトのコンテキストに応じてJSONをPOJOに逆シリアル化する慣用方法がありますか?そして、そのPOJOを前記文脈でタイプセーフな方法で処理するか?

ありがとうございました! :)

P.S. Javaがパラメータ化されたenumを許可していれば、これはかなり簡単だろう。それでは、もう一度、おそらくenumを使っているのは、それ自体の設計上の誤りでしょうか?

答えて

0

ObjectをJSONにシリアル化し、JSONをObjectに逆シリアル化するための最良の方法は、Gsonを使用することです。それはその仕事のための良いツールです

関連する問題