物联网 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);
    }

}
相关推荐
Xxtaoaooo11 小时前
工业 IoT 存储引擎选型:多模引擎在数据模型与存储设计上的取舍
数据库·物联网·dolphindb
数字新视界16 小时前
国产信创动环监控系统助力环境安全管控创新
物联网·安全·电力监控系统·用电安全·大榕树
单片机杂货铺19 小时前
基于STM32的智能市政清洁小车系统设计
stm32·单片机·嵌入式硬件·物联网·硬件工程
电化学仪器白超21 小时前
禹衡光栅长度计精度评测:基于国标0级氧化锆量块的校正与数据分析
python·单片机·嵌入式硬件·物联网·自动化
hongmai6668881 天前
ESP8684-WROOM-02C:一块被低估的RISC-V Wi-Fi模组
单片机·嵌入式硬件·物联网·5g·智能路由器·risc-v
时光の尘1 天前
【凌鸥LKS32】基础篇(二)·Timer定时器实现LED闪烁
单片机·mcu·物联网·iot·timer·lks07
microrain2 天前
从协议孤岛到统一接入:SagooIoT多协议接入层的架构演进
物联网·开源·go·sagooiot
科技新芯2 天前
通义千问进入特斯拉中国车机深度测试阶段
人工智能·物联网·生活
microrain2 天前
从云端到边缘:SagooIoT边缘计算架构的落地实践
物联网·开源·go·sagooiot
zcmodeltech2 天前
农业教学实训沙盘物联网控制系统设计:基于STM32与Modbus RTU的“感知-控制-实训”一体化方案
分布式·stm32·嵌入式硬件·物联网