-------------------对象序列化----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--------------------
分享到:
相关推荐
DTO数据传输对象简介PPT
如果想生成未预置的代码,如vo对象、前端vue页面以及其他自定义代码等,需要做一些定制和扩展来实现。 从使用角度而言,官方资料介绍得比较简要,要实际使用,仍然需要进行具体的尝试和摸索,包括必要时看下源码...
介绍json-object-mapper是一个typescript库,旨在对DTO对象和JSON对象进行序列化和反序列化。 使用该库,您将能够直接从Http / File / Stream加载JSON数据到DTO类的对象图中,并序列化DTO对象图,以便可以将其发送到...
AutoMapper完成Dto与Model的转换
NULL 博文链接:https://eddysoft.iteye.com/blog/1941484
近些年来,微服务变得越来越流行。微服务基本特征是模块化、独立、易于扩展的。它们之间需要协同工作并交换...域模型的关注点与DTO不同,我们将它们与DAO层中的数据模型分开。 这样做的主要原因是我们不想通过服务向客
把分页按钮写在dto里,其他dto继承他
java DTO 详解 java DTO 详解 java DTO 详解 java DTO 详解
简单来说,当我们需要一个对象10个字段的内容,但这个对象总共有20个字段,我们不需要把整个PO对象全部字段传输到客户端,而是可以用DTO重新封装,传递到客户端。
登陆的dto.zip
简单的EntityFramework4.3+三层+DTO,如果需要简化版的,我的资源里有一个不含DTO的版本。 这个Demo的主要功能是: 1、实体类的创建、复杂...5、实体类与DTO的转换,Mapping配置 需要的DLL文件都在packages文件夹中
让繁琐的的数据集不需要开发者自己动手就可以封装的对应的bean中去
AutoMapper工具的使用 Dto 与 实体类 的值相互转换
DTO(数据传输对象) 概述 创建该库是为了解决以下问题:从数据源获取数据模型,并且需要删除,添加,合并或转换数据模型为相似或完全不同的对象。 其他语言也有类似的库(DataMapper,DTO(C#)等)。 我永远找不...
个人对DTO这种设计模式的一些粗略见解。
$ composer require cblink/laravel-dto -vvv 生成DTO // 默认将创建到项目app/DTO目录 php artisan make:dto BaseDTO 贡献 您可以通过以下三种方式之一进行贡献: 使用归档错误报告。 回答问题或修复上的错误。 ...
项目中,自动生成javabean对象和Dto,所有的项目加注释
modify the property file of the database path, driver, user name, password, enter CMD to the D drive is running java-jar kingdao.jar disk in D test folder under the root directory of DAO and DTO ...
Dto.java和其他类-用于在J2EE应用程序的业务和持久性层之间与视图(使用EL-Expression Language“层)进行数据传输。Dto从Java API的HashMap类扩展,用于通过键封装任何类型的信息类型:key_i.key_ij.key_ijk ....:...
Springboot DTO字符字段与日期字段的转换问题 不会自动转换string与date 主要是这个意思,前端提交的JSON里,日期是一个字符串,而对应后端的实体里,它是一个Date的日期,这两个在默认情况下是不能自动转换的,...