概念
一个为了减少调用次数而在进程间传输数据的对象。
使用远程外观每一次调用都会传输大量的数据,仅仅靠返回参数无法解决。
数据传输对象可以保留所有调用需要用到的数据;
数据传输对象需要序列化,便于传输,一般地,在服务器方使用一个组装器,负责在DTO和任何领域对象之间传输数据。
运行机制
- 远端对象请求数据时,将询问一个合适的数据传输对象,而数据传输对象所提供的数据会远远大于远端对象请求的数据;
- 数据传输对象通常包含很多服务器对象,集结所有远端对象可能需要的数据;
- 数据传输对象中的域结构简单,便于序列化,使传输双方容易理解;
- 基于客户端的需求,为同一个服务采用多个数据传输对象也是可能的;
- 采用一个或者多个数据传输对象处理交互,要根据系统特点灵活掌握;
- 请求方和发送方各自准备一个数据传输对象,或者共用一个数据传输对象,也需要灵活掌握;
- 采用可变的还是不可变的数据传输对象,需要灵活掌握;
- SQL查询产生的记录集就可以看成一种数据传输对象;
- 集合、字典、生成器都可以作为数据传输对象的格式,如数组;
- 数据传输对象必须有能力序列化自己,可以采用二进制序列化格式(Java和.NET都提供)、文本格式(XML)。
- 数据传输对象和领域对象相互之间不应该有依赖,因此需要一个组装器对象,它保持了领域模型和数据传输对象二者的相对独立性。
使用时机
- 需要在一个方法调用中在两个进程之间传输多个数据项时,采用数据传输对象。
- 数据传输对象可以有多种实现方法:
- 不使用任何对象,仅使用简单的set或get方法,但是get只能返回一个对象,即使还可以采用set方法,但必须有回调机制的情况下检索信息。
- 直接使用某种字符串表示形式,而不使用对象做接口。但程序其他部分域字符串表示形式耦合。
- 采用XML传递数据时,最后采用数据传输对象进行封装。
- 作为不同软件层中各种组件通讯的通用数据源。此时,每个组件对数据传输对象做修改,然后传递到下一层。
示例-传输唱片信息(java)
把领域模型生成一个数据传输对象的代码(通过分析领域模型可知,artist类的相关数据被放到了albumDTO类中,而一个track的performer被表示成一个字符串数组) :
从数据传输对象中创建唱片对象:
从数据传输对象中更新已有唱片对象:
![](https://i-blog.csdnimg.cn/direct/010292abd8c04cec9c11d51e9de45998.png)
示例-使用XML实现序列化(java)
把数据传输对象序列化成XML格式
最后:对XML文件的输入输出