Đị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").
Nguồn
2010-05-12 08:22:37
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
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
@Roey - Tôi sẽ chỉnh sửa thông tin đó trong ... –