我正在尝试将我的业务对象序列化为 JSON 以供 Javascript 应用程序使用。问题是我试图保持我的业务对象“纯粹”,因为他们不知道数据访问或持久性。在我看来,用 toJSON() 函数“稀释”我的对象会违背这个目标。另一方面,使用外部对象来序列化我的业务对象是行不通的,因为我将所有实例变量都保密。
我是否以完全错误的方式接近这个?
我正在尝试将我的业务对象序列化为 JSON 以供 Javascript 应用程序使用。问题是我试图保持我的业务对象“纯粹”,因为他们不知道数据访问或持久性。在我看来,用 toJSON() 函数“稀释”我的对象会违背这个目标。另一方面,使用外部对象来序列化我的业务对象是行不通的,因为我将所有实例变量都保密。
我是否以完全错误的方式接近这个?
如果实例变量是私有的,它们不应出现在发送到 JavaScript 应用程序的序列化中。根据定义,如果您将它们序列化并将它们发送到单独的应用程序,它们是公共的。因此,外部对象应该有某种访问它们的方法,可能是通过某种 getter 方法。
序列化 JSON 中的数据有什么用途?纯粹是为了报道吗?如果是这样,那么 Brian 是正确的,那些变量应该有 getter 方法。
如果序列化的目的是将数据传输到可以对其进行操作的 JavaScript 应用程序,然后返回到原始应用程序,那么最好创建一个用于序列化目的的相关类,同时仍保持强封装.
例如,在 Java 中,您可以定义一个内部类。内部类实例可以直接访问封闭类实例的所有字段,而不需要 getter 方法。或者,您可以使用正确的访问修饰符与包(或命名空间)分组,以允许序列化程序访问,但不允许任何其他类访问。
或者你可以使用反射。或者劫持 toString 方法。(或者闪耀它并创建一个 toJson 方法。)
您是否正在考虑从非 JavaScript 代码(如服务器端 Java)生成 JSON?答案取决于:在 Javascript 和 Java 上处理 JSON 是完全不同的。已经有一个答案 wrt javascript-side,这似乎是正确的。
如果这是在 Java 上,那么有一些库可以提供帮助;例如 ( Jackson ) 可以反序列化任何 bean,使用常规的 getX/setX 方法自省;加上额外的(和可选的)注释。