`

对象序列化,DTO与领域对象

阅读更多
-------------------对象序列化----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--------------------
                           


分享到:
评论

相关推荐

    Javabean与DTO的区别.docx

    3. **序列化**:DTO 通常需要实现 `Serializable` 接口,方便在网络间传输。 ##### 使用场景: - **服务间通信**:在微服务架构中,DTO 用来传输服务之间的数据。 - **前后端分离**:在现代 Web 应用程序中,后端...

    Python库 | py_dto-0.2.0-py3-none-any.whl

    3. **序列化与反序列化**: 支持将DTO对象转换为字典或JSON格式,反之亦然,方便数据交换。 4. **类型安全**: 自动类型转换,确保赋值给DTO属性的数据类型正确。 5. **可扩展性**: 可以通过继承和组合来创建复杂的DTO...

    解析ABP框架中的数据传输对象与应用服务_.docx

    ### ABP框架中的数据传输对象与应用服务解析 #### 数据传输对象(DTOs) 数据传输对象(Data Transfer Objects,简称DTOs)在软件开发中扮演着重要的角色,尤其是在多层架构的应用程序中。它们主要用于在不同的...

    在序列化之间无缝切换

    在IT领域,序列化是一个关键概念,特别是在数据存储、网络传输和持久化对象时。本文将深入探讨在不同类型的序列化之间无缝切换的技巧和策略,主要关注C#编程语言,以及与.NET 2.0、3.5,Mono和ASP.NET相关的应用。 ...

    解析ABP框架中的数据传输对象与应用服务

    展现层传入数据传输对象(DTO)调用一个应用服务方法,接着应用服务通过领域对象执行一些特定的业务逻辑并且返回DTO给展现层。这样展现层和领域层被完全分离开了。在具有良好分层的应用程序中,展现层不会直接使用领域...

    数据库连接

    在这种情况下,DTO就被用来封装数据,然后以序列化形式在网络上传输,接收方再将这些序列化的DTO反序列化,恢复成可以操作的对象。 #### 结论 综上所述,DAO和DTO虽然都是数据库操作中的重要概念,但它们各自承担...

    (源码)基于OATPP框架的网络编程测试系统.zip

    3. 数据映射测试对DTO(数据传输对象)的映射进行测试,确保JSON与对象之间的转换无误。 4. JSON解析测试验证JSON数据的解析能力,包括处理嵌套对象、数组、字符串、数字等复杂数据结构。 5. 异常处理测试测试系统在...

    dotNET_Enterprise_App_Architecture

    此外,还包括数据传输对象(DTO)模式,用于在不同层之间传递数据,减少对象序列化和反序列化的开销。 4. **缓存策略**:为了提高性能,企业应用通常会采用缓存机制,如内存缓存或分布式缓存。这能减少对数据库的...

    超级有影响力霸气的Java面试题大全文档

     Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    c# http接口设计及调用demo

    - **数据传输对象(DTO)**:用于在客户端和服务器之间传输数据的对象,通常采用JSON或XML格式序列化。 - **状态码**:通过`HttpResponseMessage`设置HTTP响应的状态码,如200表示成功,404表示未找到等。 - **...

    Java专业术语标准化规范表

    反序列化是从字节流或字符串中重建对象的过程,与序列化相反,它是将对象的状态恢复为可操作的形式。 ### Dialect 方言通常指的是在特定区域或社区内使用的语言变体,但在技术上下文中可能指代某种编程语言或协议...

    flex与java通信

    AMF是一种二进制的序列化格式,它能将ActionScript对象转换为二进制数据,从而提高数据传输效率。BlazeDS/LCDS支持AMF,使得Flex与Java之间可以方便地进行对象级别的通信。 4. HTTP服务: 当不使用AMF时,Flex...

    java术语 it术语

    在 Java 中,可以使用 Java 序列化 API 或第三方库来实现对象的序列化和反序列化。 #### Dialect 方言是指在特定区域内使用的语言变体。在计算机领域中,“方言”一词有时用于描述针对特定目的或环境定制的编程...

    sf-apex-mapper:Salesforce Apex 映射器

    领域对象与 DTO 领域对象是业务逻辑中的核心实体,它们直接对应于 Salesforce 中的 Custom Objects 或标准 Objects。DTOs,另一方面,是为了在系统之间传递数据而创建的简单模型,通常不含任何业务逻辑,只是数据...

    java开发工程师.doc

    这个职位需要扎实的Java基础知识,包括但不限于异常处理、集合框架(如List、Map、Set)、I/O流、序列化、多线程、代理等核心概念。同时,对面向对象编程(OOP)有深刻的理解,能够运用这些知识来构建高效、可维护的...

Global site tag (gtag.js) - Google Analytics