用于在流中生成和解析数据的Java模式

时间:2015-06-16 03:45:02

标签: java parsing design-patterns serialization

我有一些我需要解析或生成的协议。解析采用InputStream并根据字节流生成不同类型的对象。生成器采用不同的输入并吐出OutputStream,允许写入目标流。在读取/写入流之前,可能会有一些标头变量需要初始化。

现在代码如下所示:

// Parser.
DataX parsed = DataX.parse(new ByteInputStream(new byte [] {..}));
// Access short field of DataX.
System.out.println(parsed.getX() + parsed.getY()); // data in the header.
// Access some long field by spitting InputStream.
System.out.println(parsed.buildInputStream().readFully()); // data as bytes.

// Generator.
OutputStream outstream = 
   DataX.Generator(new FileOutputStream('output')).setX(x).setY(y).build();
// Write data.
outstream.write(new byte[] {...});

DataX扩展了一个类Data,它实现了两个方法deserializeserialize作为抽象方法,最终将在parse()和{{1}内的某处调用}}

这是一个自制的设计模式,所以我想问一下这是否有意义以及是否有更多Java方法来做这种事情?

编辑:流需要合并的原因是因为数据可能很大(例如文件),并且将其完全存储在内存中是不可行/不可取的。

2 个答案:

答案 0 :(得分:0)

通常,将数据(标题值)及其表示(流)分开是个好主意。

某些组件接受流(Factory method模式) 并返回普通对象。

稍后会通过不同的组件将这些对象序列化为流。

目前它是否是一个流是无关紧要的。如果以后想要使用Json对象 - 设计不需要显着改变。

答案 1 :(得分:0)

我认为一个简洁的模式很容易理解。

// Parser
DataX header = new DataX();   // uninitialized header
InputStream is = header.input(new FileInputStream(...));
// At this point header is initialized.
// user reads data from is.

// Generator
DataX header = new DataX();   // uninitialized header
header.setX(x).setY(y);       // initialize header
OutputStream os = header.output(new FileOutputStream(...));
// At this point header is written to os.
// user writes data to os.