protostuff序列化map_为什么要实现序列化

protostuff序列化map_为什么要实现序列化这几天在看 rpc 框架的东西 一哥们写的轻量级 rpc 框架 http my oschina net huangyong blog fromerr NpC3phqY 实现 写的 rpc 很不错 就跟着撸了遍代码 里面用到的序列化工具是 protostuff 之前我们项目供应商接口用的 xml 没用过 protostuff 拿过来研究下 写个 demo 示例 以后再需要的话 也可以拿过来用

这几天在看rpc框架的东西,一哥们写的轻量级rpc框架(http://my.oschina.net/huangyong/blog/361751?fromerr=NpC3phqY)实现,写的rpc很不错,就跟着撸了遍代码,里面用到的序列化工具是protostuff,之前我们项目供应商接口用的xml,没用过protostuff,拿过来研究下,写个demo示例,以后再需要的话,也可以拿过来用。

常用的序列化基本是xml,protobuf,protostuff,xml用起来简单方便,顺手就用,但是序列化/反序列化的性能不行,protobuf,Google出品,性能比xml肯定好,用于不同语言,不同平台的交互,需要预编译,用起来麻烦,改的东西都要编译下,感觉不适合数据结构经常变动,后来就来了protostuff,无需预编译,就可以对javabean进行序列化和反序列化,性能更好。

上代码,添加maven依赖:

	

com.dyuproject.protostuff
protostuff-core
1.0.8


com.dyuproject.protostuff
protostuff-runtime
1.0.8




org.objenesis
objenesis
2.1

/pre>

p>ps:一般反射实例化java类的时候,newInstance如果java类没有默认构造函数,肯定不行,而objenesis用来对实例化java类,无需默认构造函数,官网:http://objenesis.org/tutorial.html,用起来很简单


/p>

p>SerializationUtils,序列化工具类,上面那个哥们rpc里面用的:


/p>

pre class='language-javascript'>

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.objenesis.Objenesis;
import org.objenesis.ObjenesisStd;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;

public class SerializationUtils {

private static Map, Schema> cachedSchema = new ConcurrentHashMap, Schema>();

private static Objenesis objenesis = new ObjenesisStd(true);

private SerializationUtils(){
}

@SuppressWarnings("unchecked")
private static Schema getSchema(Class cls){
Schema schema = (Schema)cachedSchema.get(cls);
if(schema == null){
schema = RuntimeSchema.createFrom(cls);
if(schema != null){
cachedSchema.put(cls, schema);
}
}
return schema;
}

@SuppressWarnings("unchecked")
public static byte[] serializer(T obj){
Class cls = (Class) obj.getClass();
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
try{
Schema schema = getSchema(cls);
return ProtostuffIOUtil.toByteArray(obj, schema, buffer);
}catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}finally{
buffer.clear();
}
}

public static T deserializer(byte[] data, Classcls){
try{
T message = (T)objenesis.newInstance(cls);
Schema schema = getSchema(cls);
ProtostuffIOUtil.mergeFrom(data, message, schema);
return message;
}catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}

下面是几个javabean

public class OrderInfo {
/**
* 订单流水
*/
private String orderNo;
/**
* 订单概要信息
*/
private Map orderItem;
/**
* 订单扩展信息
*/
private List orderExts;

/**
* 收货信息
*/
private DelieryAddress address;

//getter,setter,toString方法
public class OrderExt {
/**
* 订单流水
*/
private String orderNo;
/**
* 商品编码
*/
private String goodsNo;

//getter,setter,toString方法
public class DelieryAddress {

/**
* 收货地址
*/
private String address;
/**
* 收货人
*/
private String consigneeName;
/**
* 送达时间
*/
private Date expectTime;

//getter,setter,toString方法

测试类:

public class ProtostuffTest {

public static void main(String[] args) {
OrderInfo oldOrder = createOrder();
System.out.println(oldOrder);

byte[] orderinfo = SerializationUtils.serializer(oldOrder);

OrderInfo neOrder = SerializationUtils.deserializer(orderinfo, OrderInfo.class);

System.out.println(neOrder);
System.out.println(neOrder.getOrderNo() == null ? "y" : "n");
}

private static OrderInfo createOrder(){
OrderInfo orderInfo = new OrderInfo();
DelieryAddress delieryAddress = new DelieryAddress();
List orderExts = new LinkedList();

for(int i=0; i<2; i++){
OrderExt orderExt = new OrderExt();
orderExt.setGoodsNo("343434");
orderExt.setOrderNo("12345");
orderExts.add(orderExt);
}

delieryAddress.setAddress("江苏南京");
delieryAddress.setConsigneeName("熊猫");
delieryAddress.setExpectTime(new Date());

Map orderItem = new HashMap();
orderItem.put("google","google.com");
orderItem.put("baidu", "baidu.com");

orderInfo.setOrderItem(orderItem);
orderInfo.setAddress(delieryAddress);
orderInfo.setOrderExts(orderExts);

return orderInfo;
}

}

主要测试javabean字段里面null/string/list/map或其他javabean做为参数,看看是否能够正确序列化和反序列。

结果完全没问题:

参考:

http://my.oschina.net/huangyong/blog/361751?fromerr=NpC3phqY

http://www.cnblogs.com/xiaoMzjm/p/4555209.html 对xml,protobuf,protostuff的序列化/反序列性能做了一些对比测试

编程小号
上一篇 2025-10-09 09:40
下一篇 2025-09-23 20:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/129473.html