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

用于在流中生成和解析数据的Java模式,java,parsing,design-patterns,serialization,Java,Parsing,Design Patterns,Serialization,我需要解析或生成特定的协议。解析采用InputStream,并根据字节流生成不同类型的对象。生成器接受不同的输入并输出一个允许写入目标流的OutputStream。在读取/写入流之前,可能需要初始化一些头变量 现在的代码如下所示: // Parser. DataX parsed = DataX.parse(new ByteInputStream(new byte [] {..})); // Access short field of DataX. System.out.println(parse

我需要解析或生成特定的协议。解析采用
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
,该类实现了两个方法
反序列化
序列化
作为抽象方法,最终将在
parse()
Generator()
中的某个地方调用

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



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

一般来说,最好将数据(标题值)与其表示(流)分开

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

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


现在它是不是一条小溪都没关系。如果以后您想使用Json对象,那么设计不需要太大的改变。

我认为语法模式很容易理解

// 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.

对不起,我不明白你的意思。你建议不要使用流吗?一点也不,我是说数据模型和反序列化不应该相互依赖。现在您正在使用streams,明天您需要JSON文本,如果数据模型没有绑定到streams,那么新的反序列化/序列化将很好地集成。您能举一个例子说明分离是什么样子的吗?什么是
数据
?这不是在您的代码中声明的。@saka1029它只是一个模拟代码不要期望它运行,数据当然是一个字节数组/字节,因为它是一个
OutputStream
,但我编辑它是为了弄清楚,
outstream.write(新字节[]{…})之间的区别是什么在您的代码和
新文件输出流(“输出”).write(新字节[]{…})。流在返回给用户之前已使用标头写入,可以在内部重写以转换数据。