2010-05-12 6 views
6

Sử dụng Bộ đệm giao thức của Google, tôi có thể đặt kích thước tối đa cho tất cả thư tôi mã hóa không?Bộ đệm giao thức của Google - Bộ đệm kích thước cố định?

nếu tôi biết rằng những gì tôi mã hóa không bao giờ lớn hơn X byte, thì Google Protobuffs sẽ luôn sản xuất bộ đệm có kích thước Y và nếu tôi cho nó một lượng dữ liệu nhỏ hơn, hãy đặt nó vào kích thước Y?

Trả lời

5

Định dạng dây cho bộ đệm giao thức sẽ không làm cho điều này tầm thường; Tôi không phải là biết điều gì đó để làm điều này, nhưng một tùy chọn sẽ là sắp xếp nó thành bộ đệm với đầu trang và tiêu đề chiều dài của riêng bạn với dữ liệu bổ sung khi cần.

Bạn cần thêm tiền tố độ dài vì tiền tố này không được thêm theo mặc định và nếu không nó sẽ đọc rác ở cuối bộ đệm của bạn. Ngay cả dấu 0 sẽ không hợp pháp (nó sẽ tìm kiếm một số trường).

Tôi không thể bình luận về C++ hoặc C# phiên bản của Jon, nhưng đối với C# phiên bản của tôi (protobuf-net), bạn sẽ có thể làm điều gì đó tương tự (chưa được kiểm tra):

using(var ms = new MemoryStream(fixedLength)) { 
    ms.SetLength(fixedLength); 
    Serializer.SerializeWithLengthPrefix(ms, obj); 
    if(ms.Length > fixedLength) { /* boom */ } 
    byte[] arr = ms.ToArray(); // use this 
} 

này nên deserialize tốt nếu cũng sử dụng DeserializeWithLengthPrefix.


Trả lời câu hỏi (nhận xét); SerializeWithLengthPrefix là phương thức protobuf-net -specific; có có thể là một cái gì đó trong phiên bản C++, nhưng nó khá đơn giản. Cách dễ nhất để thực hiện điều này từ đầu là:

  • giả sử chúng ta sẽ để lại một chiều dài cố định (4 byte) tiêu đề để chỉ ra bao nhiêu dữ liệu thực tế chúng ta có
  • skip 4 byte (hoặc viết 00- 00-00-00)
  • tại serialize với phần còn lại của bộ đệm
  • tìm bao nhiêu byte bạn chỉ cần viết
  • viết giá trị đó trở lại vào lúc bắt đầu của bộ đệm

ngược lại, rõ ràng là:

  • đọc 4 byte và giải thích như một int
  • deserialize rằng nhiều càng dữ liệu

Nó là một chút chút phức tạp hơn trong protobuf- net, vì nó cung cấp thêm một vài tùy chọn (cách mã hóa int sẽ được mã hóa, và có hay không bọc nó để toàn bộ điều vẫn có thể được coi là luồng protobuf giá trị 100% - trong cụ thể tôi nghi ngờ Tôi vừa mô tả hành vi nếu tôi yêu cầu SerializeWithLengthPrefix sử dụng mã hóa có độ rộng cố định và "trường 0").

+0

Cảm ơn rất nhiều Marc, luôn hữu ích. Bạn có thể giải thích chi tiết hơn về những gì SerializeWithLengthPrefix thực sự không? Cảm ơn bạn lần nữa! – Roey

+0

Một điều nữa, tôi đang deserializing với phiên bản C + + của Protocol Buffers .... hiện DeserializeWithLengthPrefix tồn tại trong một số hình thức trong phiên bản C + + ?? – Roey

+0

@Roey - Tôi sẽ chỉnh sửa thông tin đó trong ... –