Dưới đây là một số ý tưởng dựa trên kinh nghiệm của tôi với giao thức dây tương tự như Protocol Buffers.
datetime (giây chính xác)
datetime (mili giây chính xác)
Tôi nghĩ rằng câu trả lời cho hai sẽ là như nhau, bạn sẽ chỉ thường được giao dịch với một phạm vi nhỏ hơn số trong trường hợp độ chính xác giây.
Sử dụng sint64/sfixed64 để lưu trữ độ lệch theo giây/mili giây từ một số kỷ nguyên nổi tiếng như nửa đêm GMT 1/1/1970. Các đối tượng Date date này là internally represented in Java. Tôi chắc rằng có những tương tự trong Python và C++.
Nếu bạn cần thông tin múi giờ, hãy vượt qua ngày/giờ của bạn theo UTC và lập mô hình múi giờ thích hợp làm trường chuỗi riêng biệt. Đối với điều đó, bạn có thể sử dụng số nhận dạng từ Olson Zoneinfo database vì từ đó đã trở thành tiêu chuẩn.
Bằng cách này bạn có một đại diện kinh điển cho ngày/giờ, nhưng bạn cũng có thể bản địa hóa cho bất kỳ múi giờ nào là thích hợp.
thập phân với độ chính xác cố định
Suy nghĩ đầu tiên của tôi là sử dụng một chuỗi tương tự như cách người ta xây dựng đối tượng Decimal từ gói số thập phân của Python. Tôi cho rằng điều đó có thể không hiệu quả so với một số biểu diễn bằng số.
Có thể có các giải pháp tốt hơn tùy thuộc vào miền bạn đang làm việc. Ví dụ, nếu bạn đang lập mô hình một giá trị tiền tệ, có lẽ bạn có thể lấy đi bằng cách sử dụng một uint32/64 để truyền đạt giá trị bằng cent so với số tiền đô la phân đoạn.
Ngoài ra còn có một số đề xuất hữu ích trong this thread.
thập phân với độ chính xác biến
Không Nghị định thư Buffers đã hỗ trợ này với phao/loại vô hướng đôi? Có lẽ tôi đã hiểu lầm điểm đạn này.
Dù sao, nếu bạn có nhu cầu đi xung quanh các loại vô hướng, bạn có thể mã hóa bằng IEEE-754 thành uint32 hoặc uint64 (float vs double tương ứng). Ví dụ: Java allows you to extract the IEEE-754 representation và vice versa từ các đối tượng Nổi/Đôi. Có các cơ chế tương tự trong C++/Python.
rất nhiều giá trị bool (nếu bạn có rất nhiều trong số họ có vẻ như bạn sẽ có 1-2 byte mào đầu cho mỗi người trong số họ do thẻ của họ.
Nếu bạn là lo ngại về byte bị lãng phí trên dây, bạn có thể sử dụng bit-masking techniques để nén nhiều boolean thành một uint32 hoặc uint64 đơn.
Vì không có hỗ trợ lớp đầu tiên trong Bộ đệm giao thức, tất cả các kỹ thuật này yêu cầu một chút của một người dịu dàng ' -hợp đồng giữa các đại lý . Có lẽ sử dụng quy ước đặt tên trên các trường của bạn như "_dttm" hoặc "_mask" sẽ giúp giao tiếp khi một trường nhất định có ngữ nghĩa mã hóa bổ sung ở trên và vượt ra ngoài hành vi mặc định của Bộ đệm giao thức.