Công cụ Protocol Buffers
Mã hóa, giải mã và xác thực tin nhắn Protocol Buffers
Schema Proto
Thông tin Schema
Đầ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
Trường Thô
| Trường # | Loại Wire | Giá trị |
|---|
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
- Nhập định nghĩa schema .proto trong trình chỉnh sửa schema
- Nhấp 'Phân tích Schema' để xác thực và phân tích schema
- Chọn loại tin nhắn bạn muốn làm việc với
- Để mã hóa: Nhập dữ liệu JSON và nhấp 'Mã hóa'
- Để giải mã: Nhập dữ liệu nhị phân và nhấp 'Giải mã'
- 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ườngfield: Mỗi trường có một loại, tên và số duy nhấtenum: Đị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, int64 | Số nguyên có dấu (mã hóa độ dài biến) | 0 |
| uint32, uint64 | Số nguyên không dấu | 0 |
| sint32, sint64 | Số nguyên có dấu với mã hóa ZigZag (hiệu quả cho số âm) | 0 |
| fixed32, fixed64 | Số nguyên không dấu độ rộng cố định (4 hoặc 8 byte) | 0 |
| sfixed32, sfixed64 | Số nguyên có dấu độ rộng cố định (4 hoặc 8 byte) | 0 |
| float, double | Số dấu phẩy động (32 hoặc 64 bit) | 0.0 |
| bool | Giá trị logic (true/false) | false |
| string | Chuỗi văn bản mã hóa UTF-8 | "" |
| bytes | Dữ 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 |
|---|---|---|
| 0 | Varint | int32, int64, uint32, uint64, sint32, sint64, bool, enum |
| 1 | 64-bit | fixed64, sfixed64, double |
| 2 | Length-delimited | string, bytes, embedded messages, packed repeated |
| 5 | 32-bit | fixed32, 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