- 反序列化

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序列化和反序列化的更多相关文章

  1. spring boot 集成 zookeeper 搭建微服务架构

    PRC原理 RPC 远程过程调用(Remote Procedure Call) 一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远程系统资源,R ...

  2. SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache

    前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...

  3. 【spring boot】【redis】spring boot 集成redis的发布订阅机制

    一.简单介绍 1.redis的发布订阅功能,很简单. 消息发布者和消息订阅者互相不认得,也不关心对方有谁. 消息发布者,将消息发送给频道(channel). 然后是由 频道(channel)将消息发送 ...

  4. Lombok安装及Spring Boot集成Lombok

    文章目录 Lombok有什么用 使用Lombok时需要注意的点 Lombok的安装 spring boot集成Lombok Lombok常用注解 @NonNull @Cleanup @Getter/@ ...

  5. (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...

  6. Spring Boot 2.X(六):Spring Boot 集成Redis

    Redis 简介 什么是 Redis Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库. Redis 与其他 key-value 缓存(如 Memcac ...

  7. Spring Boot 集成 RabbitMQ 实战

    Spring Boot 集成 RabbitMQ 实战 特别说明: 本文主要参考了程序员 DD 的博客文章<Spring Boot中使用RabbitMQ>,在此向原作者表示感谢. Mac 上 ...

  8. SpringBoot(十一): Spring Boot集成Redis

    1.在 pom.xml 中配置相关的 jar 依赖: <!-- 加载 spring boot redis 包 --> <dependency> <groupId>o ...

  9. Spring Boot集成Jasypt安全框架

    Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...

随机推荐

  1. Spring.NET中事务管理【转】

    http://www.cnblogs.com/GoodHelper/archive/2009/11/16/springnet_transaction.html 浏览了下写的比较清楚. 在.NET FC ...

  2. [转载]php中sleep,flush,ob_flush函数介绍

    <?phpecho str_pad(" ",1024);//当上面这句没有的时候浏览器没有任何输出 直到sleep函数设定的时间结束 才会输出//原因如下面截图for ($i ...

  3. 【状压DP】【P3959】【NOIP2017D2T2】宝藏

    Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 $n$ 个深埋在地下的宝藏屋, 也给出了这 $n$ 个宝藏屋之间可供开发的$ m$ 条道路和它们的长度. 小明决心亲自前往挖 ...

  4. 1、搭建Struts2开发环境

    一.Struts2简介: Struts2是在WebWork2的基础上发展而来的.和struts1一样, Struts2也属于MVC框架.不过有一点大家需要注意的是:尽管Struts2 和 struts ...

  5. linux配置虚拟机网络环境(老师要求的host-only)

    我这个人就是懒,这TMD是全天下最坑爹的缺点了,当然爆粗口也是缺点,让我发泄一下吧.T^T 从n久之前,开了hadoop课的一天,我就想着要配置好,结果两次课连眼镜都忘了带,可想而知是什么陪我度过了那 ...

  6. What is the bitmap index?

    示例执行计划: postgres ; QUERY PLAN ---------------------------------------------------------------------- ...

  7. AppWidget学习总结

    AppWidget学习总结 一.创建AppWidget.    1.在res/xml下创建一个xml文件,以设置widget占用的空间等信息.如widget_provider.xml        & ...

  8. 在Linux防火墙上过滤外来的ICMP timestamp

    ICMP timestamp请求响应漏洞 解决方案:  * 在您的防火墙上过滤外来的ICMP timestamp(类型13)报文以及外出的ICMP timestamp回复报文.     具体解决方式就 ...

  9. [SCOI2009]生日礼物

    https://www.luogu.org/problem/show?pid=2564 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x ...

  10. idea 修改静态资源不需要重启的办法

    快捷键Ctrl + Alt + S打开设置面板,勾选Build project automatically选项: 快捷键Ctrl + Shift + A查找registry命令: 在查找到的regis ...