`

bboss自定义类对象序列化机制介绍

阅读更多
bboss自定义类对象序列化机制介绍

1.概述
   bboss提供了自定义类对象的序列化/反序列化插件机制,这个机制与bboss序列化功能相辅相成,为应用程序提供了简单高效的对象序列化功能。
   采用bboss自定义类对象序列化机制可以方便地实现无法通过bboss本身序列化机制进行序列化的类对象的序列化功能,例如:
没有定义默认构造函数(不带参数构造函数)的类对象
兼容jvm自带的序列化功能(某些遗留系统库类、已有第三方组件库类、jdk类库中的类,这些类利用jvm序列化机制高度定制他们的序列化行为)。

本质上讲,bboss在序列化和反序列化类对象时,如果检测到特定的类提供了自定义序列化和反序列化插件,就会利用找到的插件来完成对应类对象的序列化和反序列化操作,同时如果配置了对象预处理类,那么首先会对对象进行预处理再序列化。

序列化插件机制作为序列化功能的辅助功能,通过编写自定义序列化插件机制,可以达到以下目标:
1.自定义对象的序列化和反序列化行为
2.对序列化对象进行预处理
3.为类路径定义magic数字别名,降低序列化报文大小

2.实现自定义序列化插件

所有的自定义列化插件都必须继承抽象类
org.frameworkset.soa.BaseSerial<T>
并实现BaseSerial中定义的两个抽象方法:
//序列化方法,将对象转换为String ,如何转换取决于具体方法实现
public String serialize(T object);
//反序列化方法,将String 转换为对象,如何转换取决于具体方法实现
public T deserialize(String object);

所有的预处理类都必须实现接口:
org.frameworkset.soa.PreSerial<T>
public interface PreSerial<T> {
	public T prehandle(T object);
}

prehandle方法接收预处理的对象,处理完毕再返回相同类型的对象。
以下是bboss默认提供的jvm序列化插件:
org.frameworkset.soa.JDKSerial
package org.frameworkset.soa;

import java.io.Serializable;

import org.frameworkset.util.ObjectUtils;

/**
 * <p>Title: LocalSerial.java</p> 
 * <p>Description: </p>
 * <p>bboss workgroup</p>
 * <p>Copyright (c) 2007</p>
 * @Date 2014年5月23日 上午9:06:42
 * @author biaoping.yin
 * @version 1.0
 */
public class JDKSerial extends BaseSerial<java.io.Serializable> {

	public String serialize(Serializable object) {
		// TODO Auto-generated method stub
		
		return ValueObjectUtil
				.byteArrayEncoder(ObjectUtils.toBytes(object));
		
	}

	
	public Serializable deserialize(String object) {
		try
		{
			byte[] bytes = ValueObjectUtil.byteArrayDecoder(object);
			return (Serializable)ObjectUtils.toObject(bytes);
		}
		catch(RuntimeException e)
		{
			throw e;
		}
		catch(Exception d)
		{
			throw new SerialException(d);
		}
	}	
	

}

JDKSerial插件可用于那些必须采用jvm序列化机制才能序列化的类对象,比如
net.sf.jasperreports.engine.JasperPrint
下面是专门序列化java.util.Locale对象的插件
org.frameworkset.soa.LocaleSerial
public class LocaleSerial extends BaseSerial<Locale>{

	public LocaleSerial() {
		// TODO Auto-generated constructor stub
	}

	public String serialize(Locale object) {
		// TODO Auto-generated method stub
		return object.toString();
	}

	public Locale deserialize(String object) {
		// TODO Auto-generated method stub
		return new Locale(object);
	}

}

3.自定义类型序列化插件配置
序列化插件定义完毕,即可以将其配置到序列化插件配置文件serialconf.xml
中,文件存放路径为:
org/frameworkset/soa/serialconf.xml
bboss默认提供java.util.Locale和net.sf.jasperreports.engine.JasperPrint两个类对象的序列化插件JDKSerial:
 <!-- 
自定义对象序列化插件,对于bboss无法序列化的对象,可以自行定义序列化插件,只要将对象序列化和反序列化机制定义好即可
改造序列化插件,增加preseial机制,以便支持用户自行对通过hibernate查询得到代理po对象进行预处理(比如值复制)再进行序列化
解决hibernate查询对象无法序列化问题
 -->
 <properties>
     <property name="java.util.Locale" magic="1" serial="org.frameworkset.soa.LocaleSerial"/>
     <property name="net.sf.jasperreports.engine.JasperPrint" magic="2" serial="org.frameworkset.soa.JDKSerial"/>
<!--      <property name="com.xxx.xxx.POXxxxx" magic="3" preserial="org.frameworkset.soa.POXxxxxSerial"/> -->
 </properties>


插件配置采用bboss ioc配置语法,property 元素包含四个属性,含义分别说明如下:
name代表需要序列化的class
magic属性代表类编号(类序列化编号不能重复)
serial指定序列化的插件,插件必须继承抽象类org.frameworkset.soa.BaseSerial
preserial-指定po对象进行预处理处理类,以便在序列化对象时先进行预处理,再对预处理后的对象进行序列化,预处理类必须实现接口org.frameworkset.soa.PreSerial
serial和preserial两个属性可以指定其中的一个,可以同时都指定,也可以都不指定;如果都指定,首先用preserial对应的预处理类对序列化对象进行预处理,然后在用serial对应的插件来序列化和反序列化预处理后的对象,如果都不指定则表示定义了name对应的类的一个简单别名以便降低报文大小。

serial和preserial都是单例的。


bboss序列化对象时,只要碰到java.util.Locale类型的对象或者对象属性就会采用LocaleSerial插件来实现序列化和反序列化,只要碰到net.sf.jasperreports.engine.JasperPrint类型的对象或者对象属性就会采用JDKSerial插件来实现序列化和反序列化。

4.自定义类型序列化插件使用场景
简单的实例:序列化java.util.Locale对象
try {
			java.util.Locale locale = java.util.Locale.CHINESE;
			String xml = ObjectSerializable.toXML(locale);
			locale = ObjectSerializable.toBean(xml, java.util.Locale.class);
			System.out.println(locale);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	


稍复杂的实例:改造session共享场景下JasperPrint的存储和读取

利用bboss自定义序列化插件机制,文章《bboss session共享时序列化存储jasperreports报表对象JasperPrint方法》中将JasperPrint对象设置到共享session中和从共享session中获取JasperPrint方法可以改写为:
public static void toSession(HttpServletRequest request,String key,JasperPrint jasperPrint) throws IOException
	{
		request.getSession().setAttribute(key, jasperPrint);		
	}
	
	public static JasperPrint getJasperPrint(HttpServletRequest request,String key)
	{
		return (JasperPrint)request.getSession().getAttribute(key);

	}

改造后代码显得更加简洁,充分展示出采用bboss序列化机制向共享session中存储和获取各种复杂对象的能力。
分享到:
评论

相关推荐

    Bboss和xstream序列化反序列化性能对比1

    在本文中,我们将深入探讨Bboss和Xstream两个序列化和反序列化库在性能方面的差异。这两个库在Java开发中广泛用于将对象转换为XML格式,以便于存储、传输或持久化。以下是对这两个库的详细分析。 首先,Bboss和...

    bboss 安全认证过滤器功能介绍

    通过阅读`SYSAuthenticateFilter.java`的源码,我们可以深入了解BBoss框架如何实现这些功能,并学习如何自定义和扩展安全认证过滤器,以满足特定的应用场景需求。源码分析有助于我们更好地理解和控制Web应用的安全...

    bboss mvcdemo 下载地址

    - 模型层详解:介绍如何定义模型类,以及如何与数据访问层交互,执行CRUD操作。 - 视图渲染:如何配置和使用不同的模板引擎,以及如何在视图中展示模型数据。 - AOP应用:示例展示如何定义切面,以及如何应用事务...

    bboss会话共享培训文档

    安全性方面,bboss会话共享通过在客户端基于cookie机制存储sessionid,并设置cookie的HttpOnly属性来防止XSS攻击窃取sessionid,通过设置Secure属性并在HTTPS环境下传输来防止sessionid被窃取。同时,还提供会话信息...

    由 bboss 开源的数据采集&流批一体化工具,提供数据采集、数据清洗转换处理和数据入库以及数据指标统计计算流批一体化处理功能

    **bboss-datatran** 是一个由 **bboss** 社区开源的高效数据处理工具,专注于数据采集、数据清洗转换以及数据入库等任务。它实现了流批一体化的数据处理能力,使得用户能够灵活地应对实时和批量的数据处理场景。在...

    企业级J2EE开源框架bboss

    1. **组件化开发**:BBoss支持模块化和组件化的开发模式,允许开发者根据项目需求选择必要的功能组件,避免了传统框架中“大而全”的问题,降低了系统的复杂度。 2. **数据库操作**:BBoss提供了便捷的数据访问层...

    bboss elasticsearch-5.7.8.rar

    3. `bboss-util-5.5.0.jar`和`bboss-persistent-5.5.0.jar`:这是BBoss框架的核心组件,提供了许多实用工具类和持久化操作支持,如数据库连接、事务管理等,为Elasticsearch的数据导入提供底层支持。 4. `...

    Bboss国际化实践.ppt

    7. **Bboss框架的国际化机制**: - 多种国别代码识别:通过Session、浏览器设置或Cookie识别用户语言偏好。 - 插件实现国别代码识别:方便扩展新的识别机制。 - 属性配置文件管理:使用标准的properties文件,...

    bboss-elasticsearch开发环境搭建和开发入门视频教程.

    **二、BBoss介绍** BBoss 是一个针对 Elasticsearch 的企业级开发框架,它提供了丰富的 Java API,使得开发者可以更简单地进行索引管理、查询构建、结果分析等操作。BBoss 还支持多版本兼容,方便应对 Elasticsearch...

    bboss会话共享培训文档分享

    bbosssession的架构及其特点,如跨容器支持、灵活可扩展的序列化机制、基于分布式缓存的实现,使得它能够在集群环境中实现高性能和高可用的会话管理。而其在部署和集成方面的便利性,则使得开发者能更快速地将其应用...

    bboss ioc配置文件中使用外部属性文件介绍

    BBoss是一个轻量级的企业级应用开发框架,提供了IOC(Inversion of Control)功能,使得对象之间的依赖关系可以通过配置文件进行管理。本文将详细介绍如何在BBoss的IOC配置文件中引用外部属性文件,以便更好地管理和...

    springboot整合bboss es增删改查测试demo代码

    本实例是一个基于bboss es spring boot starter的demo maven工程,可供spring boot项目集成bboss elasticsearch rest client参考 展示了通过spring boot管理单集群功能和管理多集群功能 单集群测试用例:...

    Elasticsearch rest client bboss介绍-Elastic2018中国开发者大会演讲稿.pptx

    Elasticsearch rest client bboss介绍-Elastic2018中国开发者大会演讲稿

    bboss-db-elasticsearch-tool-master_java_

    【bboss-db-elasticsearch-tool-master_java_】是一个Java ORM(对象关系映射)框架,它在功能上超越了MyBatis,提供了对多种数据库的广泛支持,包括MySQL、Oracle、PostgreSQL、SQLServer、DB2、DM以及MongoDB。...

    bboss persistent 1.0.2中方便地实现大字段(clob,blob)的处理

    1. **缓存策略**:BBoss Persistent允许开发者自定义缓存策略,以避免一次性加载整个CLOB或BLOB数据。它可以分块读取和写入,减少内存消耗。例如,当读取BLOB数据时,可以设置每次读取的字节数,以控制内存使用。 2...

    springboot集成ElasticsearchBboss调用Elasticsearch.md

    springboot集成ElasticsearchBboss调用Elasticsearch的案例分享

    基于Java的bboss开源框架设计源码

    bboss框架集成了AOP/iOC、MVC、持久化标签库、RPC、事件处理、Bean-XML序列化等多种功能。本项目基于bboss框架构建了数据采集ETL工具、流批一体化Stream工具、Elasticsearch客户端工具和WebSession共享框架等应用。

    bboss+es基本操作示例.zip

    通常,这些示例会展示如何初始化bboss客户端,如何构造和执行DSL查询,以及如何处理返回结果。 ```java // 初始化bboss客户端 ElasticsearchEntityMapping mapping = new ElasticsearchEntityMapping("my_index...

Global site tag (gtag.js) - Google Analytics