2013-03-12 31 views
5

Tôi mới vào Protobuf và tôi đã bắt đầu xem xét các ví dụ nhỏ sauprotobuf Bắt buộc điền vào và mặc định giá trị

message Entry { 
    required int32 id = 1; 
} 

sử dụng bởi các mã C++

#include <iostream> 
#include "example.pb.h" 
int main() { 
    std::string mySerialized; 
    { 
    Entry myEntry; 
    std::cout << "Serialization succesfull " 
       << myEntry.SerializeToString(&mySerialized) << std::endl; 
    std::cout << mySerialized.size() << std::endl; 
    } 
    Entry myEntry; 
    std::cout << "Deserialization successfull " 
      << myEntry.ParseFromString(mySerialized) << std::endl; 
} 

Thậm chí nếu trường "id" là yêu cầu, vì nó chưa được thiết lập, kích thước của bộ đệm tuần tự là 0 (??).

Khi tôi deserialize thông điệp một lỗi xảy ra:

[libprotobuf ERROR google/protobuf/message_lite.cc:123] Can't parse message of type "Entry" because it is missing required fields: id 

có phải là một hành vi bình thường?

Francesco

PS-Nếu tôi khởi tạo "id" với giá trị 0, hành vi này là khác nhau

pps- Chức năng SerializeToString trả về true, các ParseFromString false trả

+0

Những phương pháp đó có trả lại giá trị cho bạn biết liệu nó có hoạt động hay không? bạn đang kiểm tra chúng? –

+0

lưu ý rằng một bộ đệm độ dài bằng không là hoàn toàn hợp lệ trong protobuf - đó là những gì bạn nhận được nếu không có trường để tuần tự hóa –

Trả lời

4

Tôi không nghĩ rằng Tôi chính xác hiểu câu hỏi của bạn, nhưng tôi sẽ có một đi ở câu trả lời anyways. Hy vọng điều này sẽ giúp bạn theo cách này hay cách khác :)

Có điều này là hành vi bình thường. Bạn chỉ nên thêm required nếu trường quan trọng đối với thư. Nó có ý nghĩa ngữ nghĩa. (tại sao bạn sẽ bỏ qua một trường bắt buộc). Để thực thi điều này, protobuf sẽ không phân tích cú pháp thư.

Nó thấy rằng trường được đánh dấu bằng số 1 là bắt buộc và phương thức has_id() trả về sai. Vì vậy, nó sẽ không phân tích cú pháp thông điệp.

Trong developer guide, không nên sử dụng các trường bắt buộc.

Bắt buộc là mãi mãi Bạn phải rất cẩn thận khi đánh dấu các trường theo yêu cầu. Nếu tại một thời điểm nào đó bạn muốn dừng viết hoặc gửi trường bắt buộc, sẽ có vấn đề khi thay đổi trường thành trường tùy chọn - người đọc cũ sẽ xem xét thư không có trường này để không đầy đủ và có thể từ chối hoặc vô tình bỏ chúng. Bạn nên xem xét viết thói quen xác thực tùy chỉnh dành riêng cho ứng dụng cho bộ đệm của bạn thay thế. Một số kỹ sư tại Google đã đi đến kết luận rằng việc sử dụng yêu cầu có hại nhiều hơn là tốt; họ thích chỉ sử dụng tùy chọn và lặp lại. Tuy nhiên, quan điểm này không phải là phổ quát.

Cũng

Bất kỳ lĩnh vực mới mà bạn thêm nên không bắt buộc hoặc lặp đi lặp lại. Điều này có nghĩa là bất kỳ thư nào được tuần tự hóa theo mã sử dụng định dạng tin nhắn "cũ" của bạn có thể được phân tích cú pháp bằng mã được tạo mới của bạn, vì chúng sẽ không thiếu bất kỳ phần tử bắt buộc nào. Bạn nên thiết lập các giá trị mặc định hợp lý cho các phần tử này sao cho mã mới có thể tương tác đúng với các thư được tạo bởi mã cũ. Tương tự, các thư được tạo bởi mã mới của bạn có thể được phân tích cú pháp theo mã cũ của bạn: các tệp nhị phân cũ chỉ đơn giản bỏ qua trường mới khi phân tích cú pháp. Tuy nhiên, các trường không xác định sẽ không bị loại bỏ và nếu thông báo sau đó được tuần tự hóa, các trường không xác định sẽ được tuần tự hóa cùng với nó - vì vậy nếu thông báo được chuyển sang mã mới, các trường mới vẫn có sẵn.Lưu ý rằng việc lưu giữ các trường không xác định hiện không có sẵn cho Python

Các vấn đề liên quan