web-dev-qa-db-ja.com

さまざまな方法でオブジェクトをシリアル化する

私がWeb開発をしているとき、モデルクラスからクライアントに送信される他のクラスに属性をコピーするのが普通です。通常、モデルを受け入れて必要な情報を抽出するクラスではこれで十分です(おそらくアダプターのようなものです)が、それほど簡単ではない場合もあります。

一部のシステムでは、さまざまな理由でさまざまな属性のセットを送信する必要があり、これが単純さを失っているようです。

私の通常のアプローチでは、多くのクラスが互いに非常に似たものになってしまいます。なぜなら、1つは、いくつかの情報を必要とする1つのチャネルで使用され、他は非常に類似した情報を必要とするチャネルで使用されるためです。ただし、パフォーマンスまたはセキュリティのため、2つの合計を同じにすることはできません。 (私がチャネルと言うとき、それはそれがjsonやxmlを使用してシリアル化されたり、他のプロトコルで使用されたり、サーバーによって単にhtmlとして表示されたりする可能性があるためです。)

質問は:使用されているコンテキストに応じて、(他のオブジェクトを集約する可能性がある)オブジェクトのさまざまな変換を可能にするパターンはありますか? (コードの重複が多すぎない)

Case of study:分散型カードゲーム(ポーカーなど)では、スコア、プレーヤーの名前、プレイされたカード、および彼が持っているカードをすべてのユーザーに送信する必要があります手。しかし、ゲームが終了したら、他のプレイヤーの手にもカードを送る必要があります。また、ゲームの他のビューでは、スコアとプレイヤーの名前のみを送信する必要があります。

私の英語について申し訳ありませんが、それは私の第一言語ではありません(そして、私がコミュニケーションをとろうとしているという考えは私にとって少し複雑に思えます)。

7
Fernando

現在実行しているのは、データ転送パターンです。

あなたは「作曲」(ロバート・マーティン)を見てみたいかもしれません。これは実際のパターンではなく、ガイドラインです。

4
Andy

これは、異なるデザインパターンを使用することで解決できる場合があります。これは一般的なアプローチにつながりますが、あまり効率的ではなく、理解しにくいかもしれません。

シリアライズには Memento を使用できます。一部の状態に応じてシリアル化する場合は、 State または Strategy を使用できます。

逆シリアル化も同じように機能するはずです。

おそらく、オブジェクトの状態を決定する列挙型(int)を送信することでも十分です。

0
matcauthon

クラスシステムを設計します。すべてのクラスにはメソッドがあります。

char *toString(struct Obj *self);

Sprintfを使用して、データを文字列バッファーにシリアル化することができます。

この形式は読み取り、解析、結合が簡単なので、JSON形式を使用してシリアル化するのが好きです。

0
Edward Shen