2012-01-29 10 views
5

Tôi sắp bắt tay vào một dự án để kết nối hai chương trình, một trong C# và một trong C++. Tôi đã có một chương trình C# hoạt động, có thể nói chuyện với các phiên bản khác của chính nó. Trước khi bắt đầu với phiên bản C++, tôi đã nghĩ đến một số vấn đề:Bộ đệm giao thức, nhận C# để nói chuyện với C++: vấn đề loại và các vấn đề lược đồ

1) Tôi đang sử dụng protobuf-net v1. Tôi lấy nó các tập tin .proto từ serializer là chính xác những gì được yêu cầu như là các mẫu cho phiên bản c + +? Một tìm kiếm google đã đề cập đến một cái gì đó về pascal vỏ, nhưng tôi không có ý tưởng nếu đó là quan trọng.

2) Tôi phải làm gì nếu một trong các loại .NET không có đối tác trực tiếp trong C++? Nếu tôi có số thập phân hoặc từ điển thì sao? Tôi có phải sửa đổi các tệp .proto bằng cách nào đó và chuyển dữ liệu thành một hình dạng khác không? (Tôi sẽ kiểm tra các tập tin và xem nếu tôi có thể tìm ra nó)

3) Có bất kỳ gotchas khác mà mọi người có thể nghĩ đến không? Định dạng nhị phân và những thứ như thế?

EDIT Tôi đã xem một trong các tệp proto ngay bây giờ. Có vẻ như công cụ cụ thể NET được gắn thẻ ví dụ như bcl.DateTime hoặc bcl.Decimal. Các kiểu con được bao gồm trong các định nghĩa proto. Tôi không chắc chắn phải làm gì về các loại bcl, mặc dù. Nếu C++ prog của tôi nhìn thấy một số thập phân, nó sẽ làm gì?

Trả lời

4
  1. Có, các tệp proto phải tương thích. Vỏ bọc là về các quy ước, điều này không ảnh hưởng đến chức năng thực tế - chỉ là mã được tạo, v.v.

  2. Không có loại có thể so sánh trực tiếp trong .NET hay không. là quan trọng. Giao thức đệm chủ yếu là khá nguyên thủy - nếu bạn muốn xây dựng bất cứ điều gì lớn hơn, bạn sẽ cần phải tạo tin nhắn của riêng bạn.

  3. Điểm đệm giao thức là làm cho tất cả nhị phân tương thích trên dây, vì vậy thực sự không nên là gotchas ... đọc tài liệu để tìm hiểu về chính sách phiên bản v.v. nghĩ rằng trong phiên bản Java ít nhất, bạn nên tạo trường enum tùy chọn, và cung cấp cho kiểu enum một giá trị bằng không "không xác định" sẽ được sử dụng nếu bạn cố gắng deserialize một giá trị mới mà không phải là được hỗ trợ trong mã deserializing được nêu ra.

3

Một số bổ sung nhỏ để điểm của Jon:

  • v1 protobuf-net không có một Getaproto mà có thể giúp đỡ với một điểm khởi đầu, tuy nhiên, vì mục đích interop Tôi muốn giới thiệu bắt đầu từ một .proto; protobuf-net có thể làm việc này là xung quanh quá, hoặc thông qua "protogen", hoặc thông qua VS addin
  • khác hơn, bạn không nên có vấn đề của tôi miễn là bạn nhớ để xử lý tất cả các tập tin như nhị phân; mở tệp ở chế độ văn bản sẽ gây ra đau buồn
+0

Tôi không chắc chắn sự khác biệt là gì? Tôi đã sử dụng Serializer.GetProto để nhận một chuỗi, có thể đọc được hoàn hảo và trông giống như tệp .proto. – Carlos