-------------------对象序列化----20110629--------------------
对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中。JVM停止之后,这些状态就丢失了。在很多情况下,对象的内部状态是需要被持久化下来的。提到持久化,最直接的做法是保存到文件系统或是数据库之中。这种做法一般涉及到自定义存储格式以及繁琐的数据转换。对象关系映射(Object-relational mapping)是一种典型的用关系数据库来持久化对象的方式,也存在很多直接存储对象的对象数据库。对象序列化机制(object serialization)是Java语言内建的一种对象持久化方式,可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。除了可以很简单的实现持久化之外,序列化机制的另外一个重要用途是在远程方法调用中,用来对开发人员屏蔽底层实现细节。
由于Java提供了良好的默认支持,实现基本的对象序列化是件比较简单的事。待序列化的Java类只需要实现Serializable接口即可。Serializable仅是一个标记接口,并不包含任何需要实现的具体方法。实现该接口只是为了声明该Java类的对象是可以被序列化的。实际的序列化和反序列化工作是通过ObjectOuputStream和ObjectInputStream来完成的。ObjectOutputStream的writeObject方法可以把一个Java对象写入到流中,ObjectInputStream的readObject方法可以从流中读取一个Java对象。在写入和读取的时候,虽然用的参数或返回值是单个对象,但实际上操纵的是一个对象图,包括该对象所引用的其它对象,以及这些对象所引用的另外的对象。Java会自动帮你遍历对象图并逐个序列化。除了对象之外,Java中的基本类型和数组也是可以通过 ObjectOutputStream和ObjectInputStream来序列化的。
http://www.infoq.com/cn/articles/cf-java-object-serialization-rmi
-----------------------------20110629--------------------
--------------------------- DTO与领域对象--20110630-----------------
问题的关键在于“在边界处,应用并不是面向对象的”。如你所见,大多数序列化技术都要求public、默认的构造方法以及可写的属性。本质上,在设计DTO时,这些要求会迫使你打破封装和数据隐藏的原则。甚至连基本的不变性,如要求字段不为null/不为空都不可能实现,因为DTO会忽略掉一切。Mark Seemann继续证明自己的论断:
.服务共享模式与契约,而非类。
.DTO并不会破坏封装,以为他们根本就不是对象。
根据这种情况,Mark提出了3种观点:
第1种观点是坚持已有的观念。为了消除隔阂,我们必须得开发一个转换层,用于将DTO转换为封装良好的领域对象。这正是书中的示例所采取的方式。然而,我越发觉得这种解决方案并不是最佳的。这会导致可维护性的问题(这也是我写书时所遇到的问题:当你写完后,你所知道的要比刚开始动笔时多不少,我并不是说书不好,只是想说它并不完美而已)。
第2种观点是不再将数据当作对象,将其看作是它自身所表示的结构化数据。如果我们所用的编程语言有单独的结构化数据概念就太好了。有趣的是,虽然C#并没有这个概念,但F#却有多种方式来建模数据结构而不涉及行为。或许这是更好的数据处理方式,我还要多尝试几次才行。
第3种观点是使用动态类型。在文章Cutting Edge: Expando Objects in C# 4.0中,Dino Esposito介绍了通过动态方法来使用结构化数据,这可以更快速地自动生成代码并向结构化数据提供轻量级的API。这种方法更有前途,它并没有提供编译期的反馈,但这只不过是一种安全上的错觉而已。我们需要通过单元测试来快速获取反馈,但我们一直都在使用TDD,不是么?
http://www.infoq.com/cn/news/2011/06/DTOs-vs-Objects
--------------------------- --20110630--------------------
分享到:
相关推荐
3. **序列化**:DTO 通常需要实现 `Serializable` 接口,方便在网络间传输。 ##### 使用场景: - **服务间通信**:在微服务架构中,DTO 用来传输服务之间的数据。 - **前后端分离**:在现代 Web 应用程序中,后端...
3. **序列化与反序列化**: 支持将DTO对象转换为字典或JSON格式,反之亦然,方便数据交换。 4. **类型安全**: 自动类型转换,确保赋值给DTO属性的数据类型正确。 5. **可扩展性**: 可以通过继承和组合来创建复杂的DTO...
### ABP框架中的数据传输对象与应用服务解析 #### 数据传输对象(DTOs) 数据传输对象(Data Transfer Objects,简称DTOs)在软件开发中扮演着重要的角色,尤其是在多层架构的应用程序中。它们主要用于在不同的...
在IT领域,序列化是一个关键概念,特别是在数据存储、网络传输和持久化对象时。本文将深入探讨在不同类型的序列化之间无缝切换的技巧和策略,主要关注C#编程语言,以及与.NET 2.0、3.5,Mono和ASP.NET相关的应用。 ...
展现层传入数据传输对象(DTO)调用一个应用服务方法,接着应用服务通过领域对象执行一些特定的业务逻辑并且返回DTO给展现层。这样展现层和领域层被完全分离开了。在具有良好分层的应用程序中,展现层不会直接使用领域...
在这种情况下,DTO就被用来封装数据,然后以序列化形式在网络上传输,接收方再将这些序列化的DTO反序列化,恢复成可以操作的对象。 #### 结论 综上所述,DAO和DTO虽然都是数据库操作中的重要概念,但它们各自承担...
3. 数据映射测试对DTO(数据传输对象)的映射进行测试,确保JSON与对象之间的转换无误。 4. JSON解析测试验证JSON数据的解析能力,包括处理嵌套对象、数组、字符串、数字等复杂数据结构。 5. 异常处理测试测试系统在...
此外,还包括数据传输对象(DTO)模式,用于在不同层之间传递数据,减少对象序列化和反序列化的开销。 4. **缓存策略**:为了提高性能,企业应用通常会采用缓存机制,如内存缓存或分布式缓存。这能减少对数据库的...
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...
- **数据传输对象(DTO)**:用于在客户端和服务器之间传输数据的对象,通常采用JSON或XML格式序列化。 - **状态码**:通过`HttpResponseMessage`设置HTTP响应的状态码,如200表示成功,404表示未找到等。 - **...
反序列化是从字节流或字符串中重建对象的过程,与序列化相反,它是将对象的状态恢复为可操作的形式。 ### Dialect 方言通常指的是在特定区域或社区内使用的语言变体,但在技术上下文中可能指代某种编程语言或协议...
AMF是一种二进制的序列化格式,它能将ActionScript对象转换为二进制数据,从而提高数据传输效率。BlazeDS/LCDS支持AMF,使得Flex与Java之间可以方便地进行对象级别的通信。 4. HTTP服务: 当不使用AMF时,Flex...
在 Java 中,可以使用 Java 序列化 API 或第三方库来实现对象的序列化和反序列化。 #### Dialect 方言是指在特定区域内使用的语言变体。在计算机领域中,“方言”一词有时用于描述针对特定目的或环境定制的编程...
领域对象与 DTO 领域对象是业务逻辑中的核心实体,它们直接对应于 Salesforce 中的 Custom Objects 或标准 Objects。DTOs,另一方面,是为了在系统之间传递数据而创建的简单模型,通常不含任何业务逻辑,只是数据...
这个职位需要扎实的Java基础知识,包括但不限于异常处理、集合框架(如List、Map、Set)、I/O流、序列化、多线程、代理等核心概念。同时,对面向对象编程(OOP)有深刻的理解,能够运用这些知识来构建高效、可维护的...