`
wade6
  • 浏览: 273448 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

解耦与序列化、持久化【转】

    博客分类:
  • java
 
阅读更多

http://kongtong2004.blog.163.com/blog/static/42999512007112234439912/

 

 

在说序列化之前先要了解一下持久化和解耦的概念。

何谓“解耦”

解耦就是降低系统的耦合度,使系统更加健壮、更加灵活。

MVC的基本原理和方法:将显示层与业务逻辑层解耦。但是业务逻辑层中业务处理逻辑和数据存取逻辑是混杂在一起的。

假如要换数据库产品或者运行环境,修改的代价也非常高,代价的原因就是没有将业务逻辑和数据逻辑解耦。

将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。

另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。

所以为了解决这一困难,就出现 ORM(Object Relational Mapping)对象与数据之间的映射技术。

何谓“持久化”

持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

何谓“持久层”

持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

何谓“对象数据映射(ORM)”

ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。

设计业务逻辑代码的时候完全不需要考虑数据库JDBC的那些千篇一律的操作,只需要交给持久层处理就可以了。

 

流行的 ORM 产品

持久层框架的实现,常见的有Apache OJB 、Cayenne 、Jaxor 、Hibernate 、iBatis 、jRelationalFramework 、mirage 、SMYLE、TopLink(TopLink 是 Oracle 的商业产品,要钱的,其他均为开源项目)

除了ORM 技术,还有以下几种持久化技术:

主动域对象模式、JDO 模式、CMP 模式(CMP 负责持久化实体 EJB 组件,而 ORM 负责持久化 POJO)

只有忽视数据库为一种具体实现技术,系统才有可能完全迈向OO,至于数据库性能调优等特定功能都可交由ORM工具实现。

 

持久化(Persistence)与序列化(Serialization)

      它们相似的地方都是企图将对象和其他东西进行转化,不同之处在于持久化是希望能把它持久保存起来并在需要的时候再得到它,而序列化关心的焦点则是如何把对象变为字节流,实质上从实用角度上来讲,两者有很大程度的相互覆盖,序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后将该流写到磁盘文件或任何其他流化目标上的一个过程,这本身也可以称之为持久化。

何谓“序列化”

      序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。

java.io包有两个序列化对象的类

ObjectOutputStream负责将对象写入字节流,ObjectInputStream从字节流重构对象。

ObjectOutputStream类扩展DataOutput接口。

writeObject()方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则writeObject()方法递归序列化这些对象。每个ObjectOutputStream维护序列化的对象引用表,防止发送同一对象的多个拷贝。

ObjectInputStream类扩展DataInput接口。

readObject()方法从字节流中反序列化对象。每次调用readObject()方法都返回流中下一个Object。对象字节流并不传输类的字节码,而是包括类名及其签名。readObject()收到对象时,JVM装入头中指定的类。如果找不到这个类,则readObject()抛出ClassNotFoundException。

定制序列化过程

序列化通常可以自动完成,但有时可能要对这个过程进行控制。将数据成员声明为transient或static后,序列化过程就无法将其加进对象字节流中,没有从transient数据成员发送的数据。

使用writeObject()与readObject()方法时,还要注意按写入的顺序读取这些数据成员。

完全定制序列化过程

如果一个类要完全负责自己的序列化,则实现Externalizable接口而不是Serializable接口。

Externalizable接口定义包括两个方法writeExternal()与readExternal()。

利用这些方法可以控制对象数据成员如何写入字节流。

声明类实现Externalizable接口会有重大的安全风险。

分享到:
评论

相关推荐

    RabbitMQ传递对象

    1. **序列化与反序列化**:生产者需要将对象序列化为可传输的格式,而消费者则需要能够将接收到的消息反序列化回原始对象。确保两端使用相同的序列化库和版本是非常关键的,否则可能导致解析错误。 2. **数据兼容性...

    在序列化之间无缝切换

    在IT领域,序列化是一个关键概念,特别是在数据存储、网络通信和对象持久化等方面。本文将深入探讨如何在不同类型的序列化技术之间无缝切换,主要关注C#编程环境中的XML和.NET序列化,并讨论相关工具和技术,如C# ...

    CBF平台设计之组件对象1

    组件对象(Component Object,简称 CO)是CBF平台的核心组成部分,它主要负责处理对象与不同数据格式间的转换,包括字节流与业务数据对象之间的序列化和反序列化,以及对象到XML映射(Object Xml Mapping,简称OXM)...

    accp 6.0 S2 深入.net平台和C#编程 第十三章

    2. **文件序列化与反序列化**:序列化是将对象的状态转换为可存储或可传输的形式的过程,而反序列化则是相反的过程,即将序列化的数据恢复为对象。在.NET中,我们可以使用System.Runtime.Serialization命名空间中的...

    消息订阅发布

    **Java中的序列化**(Serialization)是将对象的状态转换成字节流的过程,这样就可以在网络上传输或持久化存储。在消息订阅发布中,序列化至关重要,因为它允许对象作为消息内容进行传递。当发布者发送一个序列化的...

    使用Redis存放Session RedisManager.7z

    文件“jbossserialization-1.0.3.GA”可能与Java对象序列化有关,因为JBOSS是一个开源的应用服务器,它包含了对Java对象序列化的支持。在将Session数据存入Redis时,通常需要将Java对象序列化为字节流,再由Redis...

    C#数据库编程相关电子书

    序列化是将对象的状态转换为可以存储或传输的形式的过程,通常用于持久化数据或在网络间传递对象。在C#中,我们可以使用System.Xml.Serialization命名空间或BinaryFormatter类来实现对象的序列化。反射则是运行时...

    SouSouProject.rar

    最后,序列化和反序列化是Java中用于持久化对象的重要技术。通过实现Serializable接口,对象可以被转换为字节流,便于存储或网络传输。嗖嗖移动业务大厅中,可能利用序列化技术保存用户的会话状态,或者在网络通信中...

    activemq-protobuf-1.1.jar.zip

    例如,在一个分布式系统中,服务间的通信可以通过Protobuf定义的消息进行,而ActiveMQ作为消息代理,负责路由、缓存和消息持久化,从而实现服务间的解耦和高可用。 总的来说,"activemq-protobuf-1.1.jar.zip"是一...

    metamorphosis(metaq)

    2. 消息存储:MetaQ服务器接收到消息后,会根据分区策略将其持久化到硬盘上,确保消息不会丢失。 3. 消费者:消费者订阅感兴趣的Topic,从MetaQ服务器拉取或接收消息。消费者可以设置为推拉模式,推模式下,服务器...

    Web应用开发中高效安全的数据持久层研究.pdf

    在Web应用开发中,数据持久层是至关重要的组成部分,它负责在应用程序和数据库之间进行数据交互,确保数据的持久化存储。数据持久层的设计需要兼顾效率和安全性,以保护企业的重要数据资源。以下是对给定内容的详细...

    SpringBoot快速玩转ActiveMQ消息队列

    - **持久化**:可以设置消息的持久性,即使在服务器重启后,未被消费的消息也不会丢失。 - **事务**:支持JMS事务,确保消息的准确传递。 - **优先级**:可以设置消息的优先级,优先级高的消息会被优先处理。 - **...

    DVD项目功能实现

    本篇文章主要围绕“DVD项目功能实现”的代码示例进行解析,涉及的内容包括Java中的文件操作、序列化与反序列化技术的应用,以及面向对象编程中DAO模式的具体实现等。 #### 一、项目背景与目标 在开始之前,先简单...

    Android应用源码之(Body的m_userData).zip

    1. **数据持久化**:如果`m_userData`是用来存储用户数据,那么可能会涉及到数据的序列化和反序列化,以便在应用关闭后仍能恢复数据。Android提供了多种数据持久化的方式,如SharedPreferences、SQLite数据库、文件...

    前端开源库-happner

    1.2 事件序列化与反序列化 Happner支持JSON和其他数据格式的事件序列化和反序列化,确保数据在不同节点间传输时的一致性和完整性。 1.3 事件持久化 Happner提供了事件持久化功能,即使在系统重启后,也能恢复未处理...

    MVP+Okhttp+Gson+Glide+DBFlow

    使用DBFlow,开发者可以更便捷地进行数据持久化,减少了手动编写SQL语句的工作量。 在项目"FreshRoad"中,这些技术的整合意味着开发者可能已经创建了一个高效、模块化的Android应用。MVP架构使得代码结构清晰,易于...

    activemq-transport-xstream-1.4.jar.zip

    XStream库则被用作数据序列化工具,它能够将Java对象转换为XML,反之亦然,这对于在网络间或者持久存储时传输和恢复对象非常有用。 "activemq-transport-xstream-1.4.jar"是这个特定组件的Java Archive(JAR)文件...

    JavaBean 简介 手册 指南 编程

    4. **序列化**:许多JavaBean实现了`java.io.Serializable`接口,允许它们的状态被序列化和反序列化,便于持久化或在网络间传输。 **JavaBean的使用场景** JavaBean主要应用于以下场景: 1. **视图表示**:在图形...

    Android-Android开发框架ZLayerAndroid核心基础服务层

    此外,该模块可能还提供了对JSON序列化与反序列化的支持,方便数据在网络和本地之间的转换。 ### 4. 用户界面模块 ZLayer可能包含了一套UI组件库,这些组件遵循Material Design设计规范,提供一致的视觉风格和交互...

    Activity之间的相互调用与传递参数

    4. **文件/数据库**: 对于大容量或者需要持久化的数据,可以考虑使用文件存储或SQLite数据库进行传递。 5. **ContentProvider**: 如果需要在不同应用间传递数据,可以使用ContentProvider。它是一个标准的接口,...

Global site tag (gtag.js) - Google Analytics