Java中大型对象模型的字符串表示?

时间:2014-08-05 06:49:34

标签: java eclipse object-to-string

我有一个大型对象模型,我想将其打印成自定义格式文本文件(最多可达100000行)。该模型由一个主类组成,它知道它的所有子元素(30个不同的类)。所以,我需要打印所有子元素及其属性。

我想过并尝试过使用toString。以这样一种方式实现它,即从主类调用toString也会以递归方式调用所有子元素的toString方法。主要问题是所有数据都进入一个字符串,如上所述,最多可能有100000行文本,所以这听起来不太好。我还需要为每个类创建/生成(使用Eclipse)toString方法。

另一个想法是使用一个接口,它将以相同的方式递归,然后我可以使用它一次打印行。问题是,我需要为每个类手动编写此实现,而不是使用Eclipse生成toStrings。

我很欣赏这种情景的想法。关键点是易于实现(和阅读)以及流畅的写作风格。

编辑:我正在实现一个标准(源自90年代:),这就是为什么输出将是“纯文本”,而不是格式化的XML甚至是JSON。

1 个答案:

答案 0 :(得分:2)

好的,另一个寻求更好的原因很简单。 String将数据存储到字节数组中。你说你打算创建100K行文本。如果每行包含100个字符,则为10M字节。我想这样的实现将是非常无效的。

因此,定义接受Object的接口(除非您为所有类共享接口或基类)和OutputStream(或可能PrintStream),即:

interface ObjectPrinter {
    print(Object root, PrintStream out);
}

现在@BorisTheSpider建议使用反射迭代类成员的图形。如果您不知道反射是什么,请查看java reflection API。使用流的优点是,您可以在拥有它时打印值块。您不必在打印之前累积整个对象图,就像将所有对象图放入String一样。

请注意,这不是一个半小时的项目。您必须关心所有基本类型,数组,集合,反向引用和循环,空值等。作为参考,您可以使用来自Apache commons的ToStringBuilderEqualsBuilder