我有一些我需要解析或生成的协议。解析采用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
,它实现了两个方法deserialize
和serialize
作为抽象方法,最终将在parse()
和{{1}内的某处调用}}
这是一个自制的设计模式,所以我想问一下这是否有意义以及是否有更多Java方法来做这种事情?
编辑:流需要合并的原因是因为数据可能很大(例如文件),并且将其完全存储在内存中是不可行/不可取的。
答案 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.