`

protostuff序列化

阅读更多

    在java中,序列化是经常需要使用的,比如对象在网络中传输,那么就必须要序列化后进行传输。而java自带的序列化使用起来虽然方便,但是它序列化后占的体积大,而且不能跨语言,因此在涉及到序列化的时候必然要找到一款高效的序列化框架。在网上查找了一下,发现protostuff使用方便,而且性能比较高,本篇博客简单记录一下ptotostuff如何实现一个序列化和反序列化。

一、需求

       1、有一个用户类(Person)和一个地址类(Address),一个人有多个地址

       2、person中有部分字段不需要序列化

             |-  使用transient修饰即可不进行序列化

       3、当对地址单独序列化时,需要定制化序列化,即有用户判断在什么情况下才可以序列化。(比如:当某个字段不可为空时才可以进行序列化)

             |-  此种情况可以通过自定义Schema进行实现

       4、如果后期序列化的类中新增了字段或删除了字段如何处理,参考  这篇文章, 此处不做处理。

二、实现

1、引入pom文件

 

<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>io.protostuff</groupId>
				<artifactId>protostuff-bom</artifactId>
				<version>1.4.4</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>io.protostuff</groupId>
			<artifactId>protostuff-api</artifactId>
		</dependency>
		<dependency>
			<groupId>io.protostuff</groupId>
			<artifactId>protostuff-core</artifactId>
		</dependency>
		<dependency>
			<groupId>io.protostuff</groupId>
			<artifactId>protostuff-runtime</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.18</version>
		</dependency>
	</dependencies>

 注意主要是引入protostuff-core和protostuff-runtime这2个依赖

 

2、定义Address类

@Data
@Builder
public class Address {
	private String address;
	private String phone;
}

 3、自定义Address的Schema,用于定制化开发,此处简单实现,当address=null时不可进行序列化

/**
 * 自定义Address的Schema,主要是用于定制化开发
 * @描述
 * @作者 huan
 * @时间 2017年12月11日 - 下午9:57:24
 */
public class AddressSchema implements Schema<Address> {

	@Override
	public String getFieldName(int number) {
		String ret = "";
		switch (number) {
		case 1:
			ret = "address";
			break;
		case 2:
			ret = "phone";
		default:
			break;
		}
		return ret;

	}

	@Override
	public int getFieldNumber(String name) {
		if ("address".equals(name)) {
			return 1;
		} else if ("phone".equals(name)) {
			return 2;
		}
		return 0;

	}

	@Override
	public boolean isInitialized(Address message) {
		if (null != message.getAddress()) {
			return true;
		}
		return false;
	}

	@Override
	public Address newMessage() {
		return Address.builder().build();

	}

	@Override
	public String messageName() {
		return Address.class.getSimpleName();
	}

	@Override
	public String messageFullName() {
		return Address.class.getName();

	}

	@Override
	public Class<? super Address> typeClass() {
		return Address.class;
	}

	@Override
	public void mergeFrom(Input input, Address message) throws IOException {
		while (true) {
			int number = input.readFieldNumber(this);
			switch (number) {
			case 0:
				return;
			case 1:
				message.setAddress(input.readString());
				break;
			case 2:
				message.setPhone(input.readString());
				break;
			default:
				input.handleUnknownField(number, this);
			}
		}
	}

	@Override
	public void writeTo(Output output, Address message) throws IOException {
		if (message.getAddress() == null) {
			throw new UninitializedMessageException(message, this);
		}
		output.writeString(1, message.getAddress(), false);
		if (null != message.getPhone()) {
			output.writeString(2, message.getPhone(), false);
		}
	}

}

 注意此处如果不了解,可以先了解一下protobuff,了解一下.proto文件的写法。

            此处做了一个简单的判断,当address==null时,不可进行序列化

4、Person类的开发

@Data
@Builder
public class Person {
	private String name;
	private Integer age;
	private transient String password;
	private List<Address> address;
}

 注意:  1、Person类包含一个Address的列表

           2、注意password字段前面有一个transient,这个表示不进行序列化

           3、@Tag注解可以用于标记字段的顺序号,但是一个类中如果要用则建议都使用

           4、上方是 官网 给出的一个警告,大致意思是:如果你想在一个非静态的内部类上使用@Tag注解,那么最好将这个非静态的内部类改成静态的内部类。
 5、编写测试代码

6、查看结果



 

 


 

  • 大小: 7.6 KB
  • 大小: 166.6 KB
  • 大小: 126.5 KB
分享到:
评论

相关推荐

    protostuff序列化包

    这个“protostuff序列化包”包含了protostuff库的源代码,使得开发者可以直接将源码集成到自己的项目中,避免了额外的依赖管理和版本冲突问题。 Protostuff序列化库主要包含以下组件和功能: 1. **序列化框架**: ...

    protostuff序列化实例

    标题“protostuff序列化实例”指的是使用Protostuff库进行数据序列化和反序列化的实际操作示例。这通常涉及到创建一个数据模型(通常是POJO,Plain Old Java Object),定义对象的字段和结构,然后使用Protostuff的...

    Protostuff序列化和反序列化的使用说明

    Protostuff序列化和反序列化的使用说明 序列化和反序列化是数据交换和存储中的重要步骤,Protostuff是一个基于protobuf的序列化和反序列化库,提供了高效、灵活和可扩展的序列化和反序列化解决方案。本文将对...

    protostuff序列化工具

    标题提到的"protostuff序列化工具"是指使用Protostuff库进行数据序列化的工具。 Protostuff的优点在于它不需要预编译的protobuf消息定义,而是通过反射机制动态解析类的字段来实现序列化和反序列化。这使得在项目中...

    基于SpringBoot+MyBatis+Redis的秒杀系统源码(附项目说明文档).7z

    默认Redis作为缓存,并使用ProtoStuff序列化/反序列化对象 统一的异常处理和优雅的接口输出 RESTful接口风格 可持续集成其他所需的服务 【代码结构】 ─common 公共库 │ ├─data 数据访问处理 │ ├─exception ...

    "优雅的SSM框架"进行完善(页面分离+nginx负载均衡+tomcat集群)

    Redis缓存(ProtoStuff序列化) Redis Sentinel主从高可用方案 Redis Cluster集群高可用方案 Druid(数据源配置 sql防注入 sql性能监控) 前后端分离(Html替代Jsp) Nginx静态加载、负载均衡 基于keepalived的nginx...

    protostuff是一个支持各种格式的一个序列化Java类库

    Protostuff作为一个轻量级的序列化库,提供高效的序列化和反序列化性能,同时保持代码简洁和易于使用。 2. ** Protostuff支持的数据格式** - **JSON (JavaScript Object Notation)**:一种轻量级的数据交换格式,...

    protostuff fastjson gson 高性能序列化jar包

    `protostuff`、`fastjson`和`gson`就是三个流行的Java序列化库,它们各自具有独特的特性和优势。 首先,让我们详细了解一下这三个库: 1. **protostuff**: - Protostuff是一个非常快速且灵活的序列化框架,它...

    spring mvc后台管理系统

    简单后台管理系统 基于maven管理,整合最新spring mvc 4.3.3.RELEASE版整合了mybatis 3.4.1,涵盖了目前互联网web系统最流行的组件,log4j2日志、freemarker模板、protostuff序列化、fastjson、redis、spring-data-...

    JedisSerialization:实现利用Jedis向Redis中写入和得到Java对象的几种序列化工具:JDK、XML、JSON、Protostuff

    4. Protostuff序列化 Protostuff是一个高性能、轻量级的序列化框架,支持多种格式(包括二进制和JSON)。它的优势在于速度快、内存消耗低,同时提供了易于使用的API。通过Protostuff,可以定义一个数据模型并将其...

    netty-rpc-master.zip

    接着,消费者使用Netty建立与服务提供者的连接,并发送经过Protostuff序列化的请求数据。服务端接收到请求后,反序列化数据,执行对应的业务逻辑,然后将结果序列化并返回给客户端。 为了保证通信的可靠性和性能,...

    将优雅的SSM框架拆分为分布式架构(基于dubbo+zookeeper)+源代码+文档说明

    Redis缓存(ProtoStuff序列化) Redis Sentinel主从高可用方案 Druid(数据源配置 sql防注入 sql性能监控) Dubbo+Zookeeper分布式服务框架 合理的分布式服务划分(common+api+service+web) 资源调度和治理中心(SOA)...

    基于Actor模型的RPC

    1、使用protostuff序列化(.proto文件编写恶心,与Protocol Buffer性能几乎接近) 2、使用Netty进行通讯(同节点RPC不走网络,直接入收件箱队列); 3、路由策略:随机路由、指定Key路由、资源Id路由、强制路由 4、...

    Protostuff for java and c#

    Protostuff是一个强大的序列化库,它为Java和C#开发者提供了一种高效、灵活的方式来序列化和反序列化对象。这个库的核心功能是将Java或C#的对象转换成二进制格式,以便于存储、传输或者与其他系统进行数据交换。 ...

    protostuff-所依赖所有jar包.

    Protostuff是一个轻量级、高性能的序列化框架,它用于序列化和反序列化Java对象到各种格式,如二进制、XML、JSON等。这个压缩包包含了Protostuff运行所需的所有依赖JAR文件,使得开发者能够在项目中便捷地集成和使用...

    protostuff 1.4源码

    7. **元数据支持**:Protostuff 支持元数据的序列化,使得序列化的数据包含了关于对象结构的信息,方便反序列化时重建对象。 8. **无侵入性**:Protostuff 不需要修改现有类或添加特定注解,使得它可以与现有的代码...

    spring data redis 封装使用

    // 使用protostuff序列化 ProtostuffSerializer serializer = new ProtostuffSerializer(); template.setValueSerializer(serializer); template.setKeySerializer(new StringRedisSerializer()); template....

    Java序列化类库protostuff.zip

    protostuff 是一个支持各种格式的一个序列化Java类库,包括 JSON、XML、YAML等格式。示例代码:public class UserSchema implements Schema {  public boolean isInitialized(User user)  {  return...

    JAVA实的RPC框架

    总结以上,Java实现的RPC框架综合运用了JDK动态代理、NIO Socket通信、反射、注解、Protostuff序列化以及Zookeeper分布式协调服务,构建了一套高效、灵活的远程调用解决方案。通过理解这些核心技术,开发者可以更好...

    序列化-protostuff-所依赖的所有jar包

    所依赖的所有jar包; threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: com/dyuproject/protostuff/MapSchema$MessageFactory] with root cause

Global site tag (gtag.js) - Google Analytics