2009-04-03 4 views
3

私はJavascriptアプリケーションで消費するためにビジネスオブジェクトをJSONにシリアル化しようとしています。問題は、データアクセスや永続性を認識していないという意味で、ビジネスオブジェクトを「純粋」に保つことを試みていることです。 toJSON()関数を使ってオブジェクトを「希釈する」ことは、この目標に反してしまうと私は思えます。一方、外部オブジェクトを使用してビジネスオブジェクトをシリアライズすると、すべてのインスタンス変数をプライベートに保つことができないため、機能しません。JSONとしてビジネスオブジェクトをシリアライズ

私はまったく間違った方法に近づいていますか?

答えて

6

インスタンス変数がプライベートである場合、それらはJavaScriptアプリケーションに送信されるシリアル化には表示されません。定義すると、それらを直列化して別のアプリケーションに送る場合、それらは公開されます。したがって、外部オブジェクトには、おそらく何らかのゲッターメソッドを使用して、それらにアクセスするための何らかの方法が必要です。

1

JSONサービスのデータをどのような目的で検索するのですか?純粋に報告のためですか?もしそうならば、ブライアンは正しい、それらの変数はゲッターメソッドを持つべきです。

シリアル化の目的は、データを操作して元のアプリケーションに戻すことができるJavaScriptアプリケーションにデータを転送することである場合、おそらく、シリアライズの目的に役立つ関連クラスを作成することで最も効果的です強いカプセル化を依然として維持する。

たとえば、Javaでは内部クラスを定義できます。内部クラスインスタンスは、getterメソッドを必要とせずに、囲むクラスインスタンスのすべてのフィールドに直接アクセスできます。または、シリアライザによるアクセスを許可するために正しいアクセス修飾子を使用してパッケージ(または名前空間)とグループ化できますが、他のクラスではアクセスできません。

または反射を使用することができます。あるいは、toStringメソッドをハイジャックします。

0

JavaScript以外のコード(サーバー側のJavaなど)からJSONを生成することを考えていますか?答えの種類はそれに依存しています。JSONの処理はJavascriptやJavaなどではかなり異なっています。すでに正しいと思われる回答があります。

これがJava上にある場合、役立つライブラリがあります。たとえば(Jackson)は、通常のgetX/setXメソッドのイントロスペクションを使用して、すべてのBeanをデシリアライズできます。追加の(およびオプションの)アノテーションを追加しました。

関連する問題