Spring boot 集成hessian - LocalDateTime序列化和反序列化
- 反序列化
import com.caucho.hessian.HessianException;
import com.caucho.hessian.io.AbstractDeserializer;
import com.caucho.hessian.io.AbstractHessianInput;
import com.caucho.hessian.io.IOExceptionWrapper; import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset; /**
* @author zenglw
* @date 2018/6/7
*/
public class LocalDateTimeDeserializer extends AbstractDeserializer { @Override
public Class getType()
{
return LocalDateTime.class;
} @Override
public Object readObject(AbstractHessianInput in,
Object []fields)
throws IOException
{
String []fieldNames = (String []) fields; int ref = in.addRef(null); long initValue = Long.MIN_VALUE; for (int i = 0; i < fieldNames.length; i++) {
String key = fieldNames[i]; if (key.equals("value")) {
initValue = in.readUTCDate();
} else {
in.readObject();
}
}
Object value = create(initValue);
in.setRef(ref, value);
return value;
} private Object create(long initValue)
throws IOException
{
if (initValue == Long.MIN_VALUE) {
throw new IOException(LocalDateTime.class + " expects name.");
}
try {
return LocalDateTime.ofEpochSecond(new Long(initValue)/1000,Integer.valueOf(String.valueOf(initValue%1000))*1000,ZoneOffset.of("+8"));
} catch (Exception e) {
throw new IOExceptionWrapper(e);
}
}
}
- 序列化
import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.AbstractSerializer; import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset; /**
* @author zenglw
* @date 2018/6/7
*/
public class LocalDateTimeSerializer extends AbstractSerializer { @Override
public void writeObject(Object obj, AbstractHessianOutput out)
throws IOException
{
if (obj == null) {
out.writeNull();
} else {
Class cl = obj.getClass(); if (out.addRef(obj)) {
return;
}
// ref 返回-2 便是开始写Map
int ref = out.writeObjectBegin(cl.getName()); if (ref < -1) {
out.writeString("value");
Long milliSecond = ((LocalDateTime) obj).toInstant(ZoneOffset.of("+8")).toEpochMilli();
out.writeUTCDate(milliSecond);
out.writeMapEnd();
} else {
if (ref == -1) {
out.writeInt(1);
out.writeString("value");
out.writeObjectBegin(cl.getName());
} Long milliSecond = ((LocalDateTime) obj).toInstant(ZoneOffset.of("+8")).toEpochMilli();
out.writeUTCDate(milliSecond);
}
}
}
}
- hessian的序列化工厂
import com.caucho.hessian.io.ExtSerializerFactory;
import com.caucho.hessian.io.SerializerFactory;
import com.klxx.ta.common.util.hessian.LocalDateTimeDeserializer;
import com.klxx.ta.common.util.hessian.LocalDateTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @author zenglw
* @date 2018/6/7
*/
@Configuration
public class HessianConfig { @Bean
public SerializerFactory serializerFactory() {
// DO 自定义hessian反序列化
// step 1. 定义外部序列化工厂
ExtSerializerFactory extSerializerFactory = new ExtSerializerFactory();
extSerializerFactory.addSerializer(java.time.LocalDateTime.class,new LocalDateTimeSerializer());
extSerializerFactory.addDeserializer(java.time.LocalDateTime.class,new LocalDateTimeDeserializer());
// step 2. 序列化工厂
SerializerFactory serializerFactory = new SerializerFactory();
serializerFactory.addFactory(extSerializerFactory);
return serializerFactory;
}
}
- hessian服务端暴露服务
import com.caucho.hessian.io.SerializerFactory;
import com.klxx.ta.foundation.api.OrganizationInfoApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.caucho.HessianServiceExporter; /**
* Hessian注册对外提供服务的service
* @author zenglw
* @date 2018/6/4
*/
@Configuration
public class HessianExportConfig { @Autowired
private OrganizationInfoApi organizationInfoApi; @Bean(name = "organizationInfoApi")
public HessianServiceExporter accountService(SerializerFactory serializerFactory) throws Exception {
HessianServiceExporter exporter = new HessianServiceExporter();
exporter.setSerializerFactory(serializerFactory);
exporter.setService(organizationInfoApi);
exporter.setServiceInterface(OrganizationInfoApi.class);
return exporter;
} }
- hessian客户端的服务代理配置
import com.caucho.hessian.io.SerializerFactory;
import com.klxx.ta.foundation.api.OrganizationInfoApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.caucho.HessianProxyFactoryBean; /**
* @author zenglw
* @date 2018/6/7
*/
@Configuration
public class HessianProxyConfig { @Value("${hessian.external.service.url.foundation}")
private String foundationUrl; @Bean(name = "accountServiceApi")
public HessianProxyFactoryBean accountServiceApi(SerializerFactory serializerFactory) {
HessianProxyFactoryBean hessianProxyFactoryBean = new HessianProxyFactoryBean();
hessianProxyFactoryBean.setSerializerFactory(serializerFactory);
hessianProxyFactoryBean.setServiceUrl(foundationUrl + "/organizationInfoApi");
hessianProxyFactoryBean.setServiceInterface(OrganizationInfoApi.class);
return hessianProxyFactoryBean;
}
}
Spring boot 集成hessian - LocalDateTime序列化和反序列化的更多相关文章
- spring boot 集成 zookeeper 搭建微服务架构
PRC原理 RPC 远程过程调用(Remote Procedure Call) 一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远程系统资源,R ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- 【spring boot】【redis】spring boot 集成redis的发布订阅机制
一.简单介绍 1.redis的发布订阅功能,很简单. 消息发布者和消息订阅者互相不认得,也不关心对方有谁. 消息发布者,将消息发送给频道(channel). 然后是由 频道(channel)将消息发送 ...
- Lombok安装及Spring Boot集成Lombok
文章目录 Lombok有什么用 使用Lombok时需要注意的点 Lombok的安装 spring boot集成Lombok Lombok常用注解 @NonNull @Cleanup @Getter/@ ...
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...
- Spring Boot 2.X(六):Spring Boot 集成Redis
Redis 简介 什么是 Redis Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库. Redis 与其他 key-value 缓存(如 Memcac ...
- Spring Boot 集成 RabbitMQ 实战
Spring Boot 集成 RabbitMQ 实战 特别说明: 本文主要参考了程序员 DD 的博客文章<Spring Boot中使用RabbitMQ>,在此向原作者表示感谢. Mac 上 ...
- SpringBoot(十一): Spring Boot集成Redis
1.在 pom.xml 中配置相关的 jar 依赖: <!-- 加载 spring boot redis 包 --> <dependency> <groupId>o ...
- Spring Boot集成Jasypt安全框架
Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...
随机推荐
- UVALive.2995 Image Is Everything (思维题 三维坐标转换)
UVALive.2995 Image Is Everything (思维题 三维坐标转换) 题意分析 这题实在是没思路,就照着打了一遍,把不理解的地方,写了注释. #include <iostr ...
- C#学习之泛型继承和静态成员
想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. ...
- jsp链接sql数据库
Connection 参数//这个参数用来执行链接数据库的操作 String 参数2="com.microsoft.sqlserver.jdbc.SQLServerDriver"; ...
- web开发环境和要求配置
对于eclipse,有很多版本,但要开发WEB程序,需要用到j2ee版本,如果是winform或android 用不带ee的版本就行,两者的明显区别是在看帮助->关于->Eclipse J ...
- Azure Pipelines
https://docs.microsoft.com/en-us/azure/devops/pipelines/?view=vsts
- 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- lua中的继承
做为一个java出身的程序媛,长时间做Lua,重复一些工作后,特别想用继承.其实很简单.因为我有一大部分的场景,背景长的都一样,所以打算做一个父类. 需要注意的是,如果子类有和父类的同名函数,就会被覆 ...
- John's trip(POJ1041+欧拉回路+打印路径)
题目链接:http://poj.org/problem?id=1041 题目: 题意:给你n条街道,m个路口,每次输入以0 0结束,给你的u v t分别表示路口u和v由t这条街道连接,要输出从起点出发 ...
- Coursera在线学习---第九节(2).推荐系统
一.基于内容的推荐系统(Content Based Recommendations) 所谓基于内容的推荐,就是知道待推荐产品的一些特征情况,将产品的这些特征作为特征变量构建模型来预测.比如,下面的电影 ...
- 使用Sysmon分析宏病毒(Macros Downloader)
样本为一个Word文件,Virustotal地址: https://www.virustotal.com/#/file/f8aede78ad92bd28f5f699b677d7d5fd362c8be8 ...