简单使用Protostuff来完成序列化与反序列化

序列化方式有很多中,JDK自带的方式,JSON方式,google的Protobuf,还有就是标题里说到的Protostuff。以下将比对JDK自带的方式。如果使用JDK自带的方式,要将pojo实现Serializable接口

class SeckillCopy implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 7244246854402197853L;

	private Long seckillId;

	private String name;

	private Integer number;

	private Date startTime;

	private Date endTime;

	private Date createTime;

	public Long getSeckillId() {
		return seckillId;
	}

	public void setSeckillId(Long seckillId) {
		this.seckillId = seckillId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getNumber() {
		return number;
	}

	public void setNumber(Integer number) {
		this.number = number;
	}

	public Date getStartTime() {
		return startTime;
	}

	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}

	public Date getEndTime() {
		return endTime;
	}

	public void setEndTime(Date endTime) {
		this.endTime = endTime;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	@Override
	public String toString() {
		return "SeckillCopy [seckillId=" + seckillId + ", name=" + name + ", number=" + number + ", startTime="
				+ startTime + ", endTime=" + endTime + ", createTime=" + createTime + "]";
	}
}
@Test
	public void test1_0() {
		SeckillCopy skc = new SeckillCopy();
		skc.setCreateTime(new Date());
		skc.setEndTime(new Date());
		skc.setName("测试数据002");
		skc.setNumber(2000);
		skc.setSeckillId(2L);
		skc.setStartTime(new Date());
		//序列化
		try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
				ObjectOutputStream oos = new ObjectOutputStream(baos)) {
			oos.writeObject(skc);
			byte[] bytes = baos.toByteArray();
			System.out.println(bytes.length);
			SeckillCopy sc = (SeckillCopy) handle(bytes);
			System.out.println("反序列化后>>>>>>>>>>>>"+sc);
		} catch (IOException e) {
			System.out.println(e);
		}
		
	}
	
	private Serializable handle(byte[] bytes){
		try(ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
				ObjectInputStream ois = new ObjectInputStream(bais)	) {
			Serializable copy = (Serializable) ois.readObject();
			return copy;
		} catch (IOException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

执行单元测试方式控制台如下输出



使用Protostuff的话。maven构建项目的话pom文件中增加jar依赖

<!-- protostuff序列化依赖 -->
     <dependency>
      <groupId>com.dyuproject.protostuff</groupId>
      <artifactId>protostuff-core</artifactId>
      <version>1.0.8</version>
     </dependency>
     <dependency>
      <groupId>com.dyuproject.protostuff</groupId>
      <artifactId>protostuff-runtime</artifactId>
      <version>1.0.8</version>

     </dependency>

class SeckillTemp{

	private Long seckillId;

	private String name;

	private Integer number;

	private Date startTime;

	private Date endTime;

	private Date createTime;

	public Long getSeckillId() {
		return seckillId;
	}

	public void setSeckillId(Long seckillId) {
		this.seckillId = seckillId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getNumber() {
		return number;
	}

	public void setNumber(Integer number) {
		this.number = number;
	}

	public Date getStartTime() {
		return startTime;
	}

	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}

	public Date getEndTime() {
		return endTime;
	}

	public void setEndTime(Date endTime) {
		this.endTime = endTime;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	@Override
	public String toString() {
		return "SeckillTemp [seckillId=" + seckillId + ", name=" + name + ", number=" + number + ", startTime="
				+ startTime + ", endTime=" + endTime + ", createTime=" + createTime + "]";
	}

}

@Test
	public void test0_0() {
		SeckillTemp st = new SeckillTemp();
		st.setCreateTime(new Date());
		st.setEndTime(new Date());
		st.setName("测试数据001");
		st.setNumber(1000);
		st.setSeckillId(1L);
		st.setStartTime(new Date());
		//序列化
		RuntimeSchema<SeckillTemp> schema = RuntimeSchema.createFrom(SeckillTemp.class);
		byte[] bytes = ProtostuffIOUtil.toByteArray(st, schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
		System.out.println(bytes.length);
		//反序列化
		SeckillTemp sc = schema.newMessage();
		ProtostuffIOUtil.mergeFrom(bytes, sc, schema);
		System.out.println("反序列化后>>>>>>>>>>>>"+sc);
	}

执行单元测试后控制台如下输出


对比与JDK的方式,生成的byte[] 所占空间是JDK方式的10分之一左右。

猜你喜欢

转载自blog.csdn.net/zclworld/article/details/80534280