CoderTools

Công cụ Protocol Buffers

Mã hóa, giải mã và xác thực tin nhắn Protocol Buffers

Schema Proto

Schema Mẫu:

Đầu vào

Phân tích schema và chọn loại tin nhắn để tạo các trường biểu mẫu

Đầu ra

Tài liệu Protocol Buffers

Protocol Buffers là gì?

Protocol Buffers (Protobuf) là cơ chế mở rộng độc lập ngôn ngữ, độc lập nền tảng để tuần tự hóa dữ liệu có cấu trúc, được phát triển bởi Google. Nó nhỏ hơn, nhanh hơn và đơn giản hơn XML và JSON cho tuần tự hóa dữ liệu.

Tính năng Chính

  • Độc lập ngôn ngữ và độc lập nền tảng
  • Nhỏ hơn và nhanh hơn XML/JSON
  • Kiểu mạnh với định nghĩa schema
  • Tương thích ngược và tương thích tiến
  • Tự động tạo mã
  • Mã hóa nhị phân hiệu quả

Cách Sử dụng Công cụ này

  1. Nhập định nghĩa schema .proto trong trình chỉnh sửa schema
  2. Nhấp 'Phân tích Schema' để xác thực và phân tích schema
  3. Chọn loại tin nhắn bạn muốn làm việc với
  4. Để mã hóa: Nhập dữ liệu JSON và nhấp 'Mã hóa'
  5. Để giải mã: Nhập dữ liệu nhị phân và nhấp 'Giải mã'
  6. Sử dụng Giải mã Thô để phân tích dữ liệu nhị phân không có schema

Tính năng Công cụ

Mã hóa

Chuyển đổi dữ liệu JSON sang định dạng nhị phân Protocol Buffers. Hỗ trợ đầu vào dựa trên biểu mẫu để nhập dữ liệu dễ dàng với xác thực kiểu.

Giải mã

Chuyển đổi dữ liệu nhị phân Protocol Buffers trở lại định dạng JSON dễ đọc. Hỗ trợ các định dạng đầu vào Base64, Hex và hex kiểu C.

Giải mã Thô

Phân tích dữ liệu nhị phân protobuf mà không cần schema. Hữu ích cho gỡ lỗi, kỹ nghệ ngược hoặc phân tích các tin nhắn không xác định.

Đầu vào Biểu mẫu

Giao diện biểu mẫu thân thiện tạo các biểu mẫu đầu vào dựa trên schema của bạn. Hỗ trợ tin nhắn lồng nhau, enum và các trường lặp lại.

Tham khảo Cú pháp Proto

Protocol Buffers sử dụng cú pháp đơn giản để định nghĩa các loại tin nhắn:

syntax = "proto3";

message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
    
    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
    
    message PhoneNumber {
        string number = 1;
        PhoneType type = 2;
    }
    
    repeated PhoneNumber phones = 4;
}
  • syntax: Chỉ định phiên bản protobuf (proto2 hoặc proto3)
  • message: Định nghĩa loại tin nhắn với các trường
  • field: Mỗi trường có một loại, tên và số duy nhất
  • enum: Định nghĩa các loại liệt kê
  • repeated: Đánh dấu trường là lặp lại (mảng/danh sách)
  • optional: Đánh dấu trường là tùy chọn (proto3)

Các Loại Vô hướng

Protocol Buffers hỗ trợ nhiều loại vô hướng:

Loại Mô tả Mặc định
int32, int64Số nguyên có dấu (mã hóa độ dài biến)0
uint32, uint64Số nguyên không dấu0
sint32, sint64Số nguyên có dấu với mã hóa ZigZag (hiệu quả cho số âm)0
fixed32, fixed64Số nguyên không dấu độ rộng cố định (4 hoặc 8 byte)0
sfixed32, sfixed64Số nguyên có dấu độ rộng cố định (4 hoặc 8 byte)0
float, doubleSố dấu phẩy động (32 hoặc 64 bit)0.0
boolGiá trị logic (true/false)false
stringChuỗi văn bản mã hóa UTF-8""
bytesDữ liệu nhị phân tùy ýempty

Các Loại Wire

Protobuf sử dụng các loại wire để xác định cách đọc giá trị từ dữ liệu nhị phân:

Loại Wire Ý nghĩa Dùng cho
0Varintint32, int64, uint32, uint64, sint32, sint64, bool, enum
164-bitfixed64, sfixed64, double
2Length-delimitedstring, bytes, embedded messages, packed repeated
532-bitfixed32, sfixed32, float

Thực hành Tốt nhất

  • Sử dụng cú pháp proto3 cho các dự án mới - nó đơn giản hơn và được hỗ trợ rộng rãi hơn
  • Giữ số trường ổn định - không bao giờ sử dụng lại hoặc thay đổi số cho các trường hiện có
  • Sử dụng tên trường có ý nghĩa mô tả rõ ràng dữ liệu
  • Dành số trường 1-15 cho các trường thường dùng (chúng sử dụng 1 byte)
  • Sử dụng từ khóa 'repeated' cho mảng/danh sách giá trị
  • Định nghĩa enum cho các trường có tập hợp giá trị cố định

Câu hỏi Thường gặp

Sự khác biệt giữa proto2 và proto3 là gì?

Proto3 đơn giản hóa cú pháp bằng cách loại bỏ các trường bắt buộc - tất cả các trường đều là tùy chọn theo mặc định. Nó cũng thay đổi giá trị mặc định và loại bỏ phát hiện sự hiện diện của trường cho các loại vô hướng. Proto3 được khuyến nghị cho các dự án mới.

Tôi có thể giải mã protobuf mà không cần schema không?

Có! Sử dụng tính năng 'Giải mã Thô' để phân tích dữ liệu nhị phân mà không cần schema. Tên trường sẽ được hiển thị dưới dạng số (field_1, field_2, v.v.) và một số thông tin loại có thể không rõ ràng.

Tại sao dữ liệu được mã hóa của tôi khác với mong đợi?

Mã hóa Protobuf là xác định, nhưng các giá trị mặc định (0, false, chuỗi rỗng) thường không được mã hóa trong proto3 để tiết kiệm không gian. Ngoài ra, thứ tự các trường trong JSON không ảnh hưởng đến mã hóa nhị phân.

Làm thế nào để xử lý tin nhắn lồng nhau?

Định nghĩa tin nhắn lồng nhau trong schema của bạn và sử dụng các đối tượng JSON lồng nhau. Trong chế độ biểu mẫu, nhấp vào nút trường lồng nhau để mở hộp thoại chỉnh sửa dữ liệu lồng nhau.

Các Trường hợp Sử dụng Phổ biến

  • Giao tiếp giữa các dịch vụ trong microservices (gRPC)
  • Lưu trữ dữ liệu và bộ nhớ đệm
  • Tệp cấu hình
  • Giao thức mạng và API

Tài liệu Tham khảo