シリアル化ロジックはエンティティまたは他のクラスにある必要があります

ホセ・シフエンテス

オブジェクトのシリアル化ロジック(フィールドのXMLまたはJSONの名前と値へのマッピング)はどこに配置する必要がありますか?各エンティティオブジェクト内、またはシリアル化のみに関係する異なるクラスのセットに?この質問に関連する他のベストプラクティスはありますか?

例えば:

class Person {
    String name;
}

一部の人々はこのようにそれについて行きます:

class Person {
    String name;
    public String toJson () {
      // build JSON, use 'name' field
    }
}

しかし、toXML()、toCSV()、toXYZ()もその方向を維持する必要がある場合、ひどく汚染されたコードが作成され、単一のtoJsonメソッドであるIMHOでもすでに破られている単一責任の原則が破られます。

別のオプションとこれは私が通常行うことです:

interface Serializer {  public String toJson (); }

class PersonJsonSerializer implements Serializer {
    private Person p;
    public PersonJsonSerializer (Person p) { this.person = p; }
    public String toJson () {
      // build JSON, use p.name
    }
}

次に、工場はエンティティタイプに応じてシリアライザーを配布します。

class JsonSerializerFactory {
    public Serializer getSerializer (Object o) {
        if (o instanceof Person) {
            return new PersonJsonSerializer ((Person)o);
        }
        else if (o instanceof Account) {
            return new AccountJsonSerializer ((Account)o);
        }
        // ... etc
    }
}

XMLSerializerFactory、CSVSerializerFactoryなどもあります。

ただし、ほとんどの場合、人々はシリアル化を完全に制御したいと考えており、シリアル化に同意せず、各クラス内にtoJsonメソッドを含めることを好みます。彼らは、はるかに単純でエラーが発生しにくいと主張するでしょう。

進むための好ましい方法は何ですか?この問題の解決策を実装するためのより良い代替手段はありますか?

Naeem

多くの理由から、シリアル化ロジックをPOCO /データクラスの一部にすべきではないと思います。

  1. 単一責任の原則(データクラスはデータモデルのみを定義する必要があり、シリアル化ロジックに注意してください)
  2. あなたが必要とするかもしれない異なる種類のシリアライザーがあるかもしれません(あなたが言ったようにjson / xmlなど)
  3. ほとんどの場合、シリアル化の実装は汎用ソリューションまたは外部パッケージです。一部のオブジェクトにカスタム実装が必要な場合でも、特定のクラスに拡張できる汎用ソリューションを使用できるため、クラスごとに実装する必要はありません。
  4. POCOクラスを属性で装飾して、特殊な条件(プロパティのシーケンス、プロパティ名、または複合型プロパティのカスタマーシリアライザーを制御するなど)のシリアライザーを指示できます。

他の理由もありますが、シリアル化ロジックをPOCO /データモデルに配置すべきではないという強い議論がいくつかあります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

シリアル化ロジックはエンティティまたは他のクラスにある必要があります

分類Dev

ページネーションリピーターにはアクティブなクラスがあり、ページネーションボタンがクリックされたときに移動する必要があります

分類Dev

アソシエーションを介した他のクラスのプロパティへのアクセスは明示的にする必要がありますか、それとも暗黙的ですか?

分類Dev

私は、モバイルアプリのバックエンドのためのOAuth(または他に何を)使用する必要がありますか? - このような場合にのみ* 1 *「サードパーティ」のアプリケーションがあります

分類Dev

トラッキングピクセルは、アクセシビリティ(WCAG 2.0)のためにalt属性を持つ必要がありますか?

分類Dev

サードパーティライブラリはコールバックをバインドしていますが、クラスのプロパティにアクセスする必要があります

分類Dev

1番目のテキストフィールドのラジオボタンをクリックしている間、2番目のテキストフィールドは非アクティブである必要があります

分類Dev

エラー:エンティティクラスには@Entityアノテーションを付ける必要があります

分類Dev

ラップされたEFエンティティはどのクラスに保存する必要がありますか?

分類Dev

WebApiとWinForms、および「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です」というエラーのあるシリアルポート

分類Dev

言語式プロパティ「0」は評価できません。プロパティ名は文字列である必要があります-KeyVaultアクセスポリシーの追加中にARMテンプレートエラーが発生しました

分類Dev

jQueryまたはその他のサードパーティライブラリをロジックコードと一緒にバンドルする必要がありますか?

分類Dev

プロパティの値SecurityGroupIdsは、スタックの更新中に文字列エラーのリストタイプである必要があります

分類Dev

Doctrineのロールバックイベントはありますか?つまり、ロールバックがあるチェンジリスト上のエンティティに処理を実行します

分類Dev

私のAndroidアプリには2つのアクティビティがあります。2番目のアクティビティでは、前のアクティビティのスクリーンショットを撮るためのボタンがあります

分類Dev

「Serializable」クラスのフィールドは、一時的またはシリアル化可能である必要があります

分類Dev

アクティビティが表示されるたびにネットワークリクエストを実行する場合、ネットワークリクエストはどのライフサイクルメソッドに入れる必要がありますか?

分類Dev

コンソールにエラーが表示されるのはなぜですか:アクティベータースロットは、すでにバインドしているのにバインドする必要がありますか?

分類Dev

Hibernateテーブルクラスはシリアル化可能である必要がありますか?

分類Dev

グライド画像付きのRecyclerViewは、アクティビティと一緒にスクロールする必要があります

分類Dev

Windowsシステムがオンになったとき。私のC ++プログラムはアクティブ化する必要がありますか?どうやってやるの?

分類Dev

アプリケーションの初期化中にエラーが発生しました:そのようなプロパティはありません:クラスのセッション:BootStrap

分類Dev

フリップクロックのカウントダウンにアクティブなクラスを追加する必要があります

分類Dev

Python-ネットワークアクティビティにスレッドまたはプロセスを使用する必要がありますか?

分類Dev

列挙型は、クラスの最初のプロパティがある場合fasterxmlでは、デシリアライズJSONた後、他のフィールドはNULLであります

分類Dev

スクリーンリーダーのアクセシビリティ:ボタンはどの程度「おしゃべり」にする必要がありますか?

分類Dev

WebAPIエラー-このリクエストはブロックされました。コンテンツはHTTPS経由で提供する必要があります

分類Dev

プロパティを初期化することにより、データオプションで、またはクラスベースのコンポーネントに対して、このプロパティがリアクティブであることを確認します

分類Dev

C#Jsonをジェネリックエンティティに逆シリアル化するには、基本クラスを使用しますか?

Related 関連記事

  1. 1

    シリアル化ロジックはエンティティまたは他のクラスにある必要があります

  2. 2

    ページネーションリピーターにはアクティブなクラスがあり、ページネーションボタンがクリックされたときに移動する必要があります

  3. 3

    アソシエーションを介した他のクラスのプロパティへのアクセスは明示的にする必要がありますか、それとも暗黙的ですか?

  4. 4

    私は、モバイルアプリのバックエンドのためのOAuth(または他に何を)使用する必要がありますか? - このような場合にのみ* 1 *「サードパーティ」のアプリケーションがあります

  5. 5

    トラッキングピクセルは、アクセシビリティ(WCAG 2.0)のためにalt属性を持つ必要がありますか?

  6. 6

    サードパーティライブラリはコールバックをバインドしていますが、クラスのプロパティにアクセスする必要があります

  7. 7

    1番目のテキストフィールドのラジオボタンをクリックしている間、2番目のテキストフィールドは非アクティブである必要があります

  8. 8

    エラー:エンティティクラスには@Entityアノテーションを付ける必要があります

  9. 9

    ラップされたEFエンティティはどのクラスに保存する必要がありますか?

  10. 10

    WebApiとWinForms、および「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です」というエラーのあるシリアルポート

  11. 11

    言語式プロパティ「0」は評価できません。プロパティ名は文字列である必要があります-KeyVaultアクセスポリシーの追加中にARMテンプレートエラーが発生しました

  12. 12

    jQueryまたはその他のサードパーティライブラリをロジックコードと一緒にバンドルする必要がありますか?

  13. 13

    プロパティの値SecurityGroupIdsは、スタックの更新中に文字列エラーのリストタイプである必要があります

  14. 14

    Doctrineのロールバックイベントはありますか?つまり、ロールバックがあるチェンジリスト上のエンティティに処理を実行します

  15. 15

    私のAndroidアプリには2つのアクティビティがあります。2番目のアクティビティでは、前のアクティビティのスクリーンショットを撮るためのボタンがあります

  16. 16

    「Serializable」クラスのフィールドは、一時的またはシリアル化可能である必要があります

  17. 17

    アクティビティが表示されるたびにネットワークリクエストを実行する場合、ネットワークリクエストはどのライフサイクルメソッドに入れる必要がありますか?

  18. 18

    コンソールにエラーが表示されるのはなぜですか:アクティベータースロットは、すでにバインドしているのにバインドする必要がありますか?

  19. 19

    Hibernateテーブルクラスはシリアル化可能である必要がありますか?

  20. 20

    グライド画像付きのRecyclerViewは、アクティビティと一緒にスクロールする必要があります

  21. 21

    Windowsシステムがオンになったとき。私のC ++プログラムはアクティブ化する必要がありますか?どうやってやるの?

  22. 22

    アプリケーションの初期化中にエラーが発生しました:そのようなプロパティはありません:クラスのセッション:BootStrap

  23. 23

    フリップクロックのカウントダウンにアクティブなクラスを追加する必要があります

  24. 24

    Python-ネットワークアクティビティにスレッドまたはプロセスを使用する必要がありますか?

  25. 25

    列挙型は、クラスの最初のプロパティがある場合fasterxmlでは、デシリアライズJSONた後、他のフィールドはNULLであります

  26. 26

    スクリーンリーダーのアクセシビリティ:ボタンはどの程度「おしゃべり」にする必要がありますか?

  27. 27

    WebAPIエラー-このリクエストはブロックされました。コンテンツはHTTPS経由で提供する必要があります

  28. 28

    プロパティを初期化することにより、データオプションで、またはクラスベースのコンポーネントに対して、このプロパティがリアクティブであることを確認します

  29. 29

    C#Jsonをジェネリックエンティティに逆シリアル化するには、基本クラスを使用しますか?

ホットタグ

アーカイブ