2011-08-14 19 views
6

Tôi muốn sử dụng bộ đệm giao thức trong chương trình của mình để đọc dữ liệu từ một tệp. Tôi cũng muốn có thể chỉnh sửa tệp dữ liệu với bất kỳ trình soạn thảo văn bản nào, để bắt đầu (tôi sẽ viết một trình soạn thảo dữ liệu sau này và chuyển sang nhị phân đầy đủ).Bộ đệm giao thức có thể phân tích cú pháp thư trong định dạng "gỡ lỗi chuỗi" không?

Có cách nào để phân tích định dạng có thể đọc được không? (chuỗi gỡ lỗi được cung cấp bởi chính protobuf, hoặc một số định dạng khác).

Trả lời

4

Có định dạng dựa trên văn bản quá, nhưng hỗ trợ cho điều này là triển khai cụ thể. Ví dụ: tôi không hỗ trợ nó ở tất cả trong protobuf-net. Nhưng có: được xác định và thảo luận (ví dụ) tại đây: http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.text_format.html

Cá nhân tôi muốn sử dụng nhị phân và viết một giao diện người dùng xung quanh mô hình.

+1

Cảm ơn! Điều này sẽ làm, vì nó là tạm thời. Tôi không cần tính di động và khả năng tương thích lâu dài tại thời điểm này, và tôi sẽ viết một trình soạn thảo sau này nếu cần thiết. – Gnurfos

0

Bạn có chắc chắn muốn sử dụng ProtoBuf không? Bạn có thể sử dụng Json lúc đầu, và sau đó chuyển sang Bson hoặc MessagePack dưới dạng định dạng nhị phân.

Kết hợp Json/Bson có lợi thế là bạn có thể sử dụng cùng một thư viện (Json.net) cho họ. Tôi tin rằng Bson là một chút lớn hơn ProtoBuf mặc dù.

Hoặc bạn có thể sử dụng Json/MessagePack. Về mặt kỹ thuật MessagePack là một định dạng nhị phân tốt hơn so với Bson/ProtoBuf IMO. Nhưng sự hỗ trợ công cụ là tồi tệ hơn, và bạn sẽ cần một thư viện riêng biệt cho Json và MessagePack. Nó hỗ trợ tất cả mọi thứ Json và nhiều hơn nữa (đặc biệt nó có thể sử dụng cả hai chuỗi và các phím số nguyên trong từ điển).

so sánh nhanh của MsgPack và Protobuf:

  • Kết quả kích thước dữ liệu nếu cấu trúc tương tự được sử dụng có vẻ là có thể so sánh.
  • Hiệu suất mã hóa/giải mã phần lớn phụ thuộc vào việc triển khai, nhưng tôi cho rằng nó có độ lớn tương tự
  • MsgPack tự mô tả nhiều hơn. . Trong ProtoBuf bạn thậm chí không nhìn thấy nếu một cái gì đó là một submessage hoặc một blob.
  • MsgPack hỗ trợ các phím không phải nguyên trong từ điển. Một điều này cho phép lưu trữ các thuộc tính theo tên khi bạn không quan tâm đến kích thước và chuyển sang các số nguyên trong đó các mức tăng lớn.
  • MsgPack lưu trữ số phần tử thay vì kích thước cho mảng/từ điển. Điều này có lợi thế là bạn không cần phải quay trở lại đầu ra và phù hợp với kích thước tất cả các thời gian, làm cho việc viết một serializer dễ dàng hơn và có thể cho tốc độ ghi nhanh hơn. Mặt khác, bạn không thể dễ dàng bỏ qua một phần tử vì bạn không biết kích thước của nó.
  • MsgPack tự nhiên hỗ trợ một phần lớn của Json, vì vậy bạn có thể di chuyển từ Json dễ dàng.
  • Hỗ trợ công cụ, tài liệu và mức độ phổ biến tốt hơn nhiều với ProtoBuf. Đặc biệt ProtoBuf.net trông đẹp hơn mã C# có sẵn cho MsgPack.
+0

Cảm ơn các giải pháp thay thế, nhưng tôi sẽ thử dùng protobuf. Tất cả các giải pháp có vẻ khá giống nhau, cho nhu cầu của tôi, vì vậy tôi chỉ tự ý chọn một. – Gnurfos

+0

Tôi tò mò: những kẻ côn đồ trong MsgPack bạn thấy là tốt hơn? –

+0

@Marc Đó là tự mô tả nhiều hơn chắc chắn là một điểm cộng lớn. Trong ProtoBuf tôi thậm chí không nhìn thấy nếu một cái gì đó là một submessage hoặc một blob. Các phím từ điển không phải là số nguyên cũng tốt. Đối với những khác biệt khác là tương đối nhỏ, nhưng trong hầu hết chúng tôi hơi thích MsgPack. – CodesInChaos

2

Nếu bạn không nhớ sử dụng công cụ dòng lệnh, các Piqi project bao gồm piqi convert lệnh để chuyển đổi giữa các định dạng 4: Buffers Nghị định thư nhị phân, JSON, XML và Piq. Định dạng Piq được thiết kế đặc biệt để xem và chỉnh sửa dữ liệu trong trình soạn thảo văn bản.

0

Câu hỏi không chỉ định ngôn ngữ lập trình và câu trả lời của tôi chỉ là về Java.

Trong Java, phương thức của thể hiện toString trả về định dạng văn bản có thể đọc được bằng con người.Các định dạng tương tự sau đó có thể được phân tích thành một trường hợp Message bởi TextFormat.merge:

String messageString = ... 
MyMessage.Builder builder = MyMessage.newBuilder(); 
TextFormat.merge(messageString, builder); 
MyMessage newMessage = builder.build(); 

(Variations of the merge method cũng có thể đọc từ một dòng suối, để tránh đọc chuỗi thông điệp toàn bộ vào bộ nhớ.)

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