物联网 Protobuf文本协议入门

物联网 Protobuf文本协议入门

Protobuf(Protocol Buffers)是Google开发的高效、跨语言的序列化框架,相比JSON/XML等文本协议,Protobuf在性能、空间占用和跨语言支持方面具有显著优势

源码

源码https://gitee.com/kcnf-webrtc/iot-sample/tree/master/protobuf/protobuf-api-01

proto文件定义与语法规范

基础语法

定义用户数据结构的示例文件(src/main/proto/user.proto):

复制代码
syntax = "proto3";

package com.jysemel.iot.protobuf;

option java_package = "com.jysemel.protobuf.model";
option java_outer_classname = "UserProto";

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
  int32 age = 4;
}
针对上面关键语法说明
语法项 说明
syntax = "proto3" 指定使用Protocol Buffers v3版本
option java_package 定义生成的Java类包路径
option java_outer_classname 定义生成的外层类名(用于嵌套消息)
repeated 定义列表类型字段,对应Java中的List或数组
注意事项
  • 其中User和java_outer_classname 名称不要冲突,否则编译出现下面错误

protoc did not exit cleanly. Review output for more information.

添加依赖

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.jysemel.iot</groupId>
        <artifactId>iot-sample</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>protobuf</artifactId>
    <packaging>pom</packaging>

    <modules>
        <module>protobuf-api-01</module>
        <module>protobuf-api-02</module>
        <module>protobuf-sample01</module>
        <module>protobuf-sample</module>
    </modules>



    <properties>
        <protobuf.version>3.21.12</protobuf.version>
    </properties>

    <dependencies>
        <!-- Protobuf Java 支持 -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>${protobuf.version}</version>
        </dependency>

        <!-- 可选:支持更便捷的 Protobuf 消息转换 -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>${protobuf.version}</version>
        </dependency>
    </dependencies>

    <build>
        <extensions>
            <!-- OS 检测插件,用于 protobuf 插件 -->
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.7.0</version>
            </extension>
        </extensions>
        <plugins>
            <!-- Spring Boot Maven 插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!-- Protobuf 编译插件 -->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.21.12:exe:${os.detected.classifier}</protocArtifact>
                    <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                    <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
                    <clearOutputDirectory>false</clearOutputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

执行编译后面代码

序列化与反序列化示例

复制代码
package com.jysemel.iot;

import com.google.protobuf.InvalidProtocolBufferException;
import com.jysemel.protobuf.model.UserProto;

public class ProtoBufDemo {
    public static void main(String[] args) {
        // 1. 构建User对象
        UserProto.User user = UserProto.User.newBuilder()
                .setId(123)
                .setName("Alice")
                .setEmail("alice@example.com")
                .setAge(25)
                .build();

        // 2. 序列化为字节数组
        byte[] data = user.toByteArray();
        System.out.println("Serialized data length: " + data.length);

        // 3. 反序列化
        try {
            UserProto.User parsedUser = UserProto.User.parseFrom(data);
            System.out.println("Parsed User: " + parsedUser);
            System.out.println("Name: " + parsedUser.getName());
            System.out.println("Email: " + parsedUser.getEmail());
            System.out.println("Age: " + parsedUser.getAge());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
}
关键方法说明
方法 说明
toByteArray() 将消息序列化为字节数组
writeTo(OutputStream) 将消息写入输出流(适用于网络传输)
parseFrom(byte\[\]) 从字节数组反序列化消息
parseDelimitedFrom(InputStream) 从带长度前缀的输入流反序列化消息(适用于流式传输)
Protobuf与JSON互转
复制代码
package com.jysemel.iot;

import com.google.protobuf.util.JsonFormat;
import com.jysemel.protobuf.model.UserProto;

public class JsonConversionDemo {

    public static void main(String[] args) throws Exception {
        // 1. 构建User对象
        UserProto.User user = UserProto.User.newBuilder()
                .setId(123)
                .setName("Alice")
                .setEmail("alice@example.com")
                .setAge(25)
                .build();

        // Protobuf转JSON
        String json = JsonFormat.printer().print(user);
        System.out.println("JSON: " + json);

        // JSON转Protobuf
        UserProto.User.Builder builder = UserProto.User.newBuilder();
        JsonFormat.parser().merge(json, builder);
        UserProto.User parsedUser = builder.build();
        System.out.println("Parsed from JSON: " + parsedUser);
    }

}
相关推荐
电子科技圈8 分钟前
芯科科技2026年Tech Talks技术系列讲座再增添全新主题共探无线SoC架构演进与安全合规
科技·嵌入式硬件·mcu·物联网·安全·架构·iot
SZYSK3 小时前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节
做萤石二次开发的哈哈3 小时前
双光谱测温相机二次开发:先查通道号再测温,六类形态一套规范接入
物联网·热成像·红外测温·工业测温·蓝海aiot一站式工作台·aiot开发·双光谱
画中有画4 小时前
时序数据库在物联网系统中的应用
数据库·物联网·时序数据库
voipmaker13 小时前
GB28181 对接踩坑实录:注册不上、目录不全、流卡顿,一次说清(附 2022 版变更清单)
物联网·音视频·实时音视频·信息与通信·iot·gb28181·国标gb28181
Chery114014 小时前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
TDengine (老段)1 天前
TDengine IDMP 十大实用功能(3)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
实验室管理云平台1 天前
面向高职院校实训场景:实训实验室管理平台整体方案分享
大数据·科技·物联网·自动化
wtblszn1 天前
热水机组物联网远程监控系统方案
物联网
悟天特斯1 天前
安防一体化:从“各管各的“到“全局联动“
java·大数据·网络·人工智能·物联网