2012-01-29 18 views
5

Mam zamiar rozpocząć projekt połączenia dwóch programów, jednego w języku C# i jednego w języku C++. Mam już działający program C#, który jest w stanie rozmawiać z innymi wersjami samego siebie. Zanim zacznę od wersji C++, pomyślałem o kilku problemach:Bufory protokołów, uzyskanie C#, aby porozmawiać z C++: problemy typu i problemy z schematem

1) Używam protobuf-net v1. Rozumiem, że pliki .proto z serializera są dokładnie takie, jakie są wymagane jako szablony dla wersji C++? Wyszukiwarka google wspomniała coś o paskowanej obudowie, ale nie mam pojęcia, czy to ważne.

2) Co mam zrobić, jeśli jeden z typów .NET nie ma bezpośredniego odpowiednika w C++? Co zrobić, jeśli mam separator dziesiętny lub słownik? Czy muszę w jakiś sposób zmodyfikować pliki .proto i zgnieść dane na inny kształt? (Sprawdzę pliki i zobaczę, czy mogę to rozgryźć)

3) Czy są jakieś inne pomysły, które ludzie mogą wymyślić? Binarne formaty i takie rzeczy?

EDYTOWANIE Przeglądam teraz jeden z plików proto. Wygląda na to, że .NET specyficzne rzeczy są oznaczone np. Bcl.DateTime lub bcl.Decimal. Podtypy są zawarte w definicjach proto. Nie jestem jednak pewien, co zrobić z typami bcl. Jeśli mój C++ prog widzi dziesiętny, co zrobi?

Odpowiedz

4
  1. Tak, pliki proto powinny być zgodne. Obudowa dotyczy konwencji, które nie powinny wpływać na aktualną funkcjonalność - tylko wygenerowany kod itp.

  2. Nie ma znaczenia, czy istnieje bezpośredni porównywalny typ w .NET, który jest ważny - czy bufory protokołów obsługują typ, który jest ważne. Bufory protokołów są w większości dość prymitywne - jeśli chcesz zbudować coś większego, będziesz musiał stworzyć własne wiadomości.

  3. Punktem buforów protokół jest, aby to wszystko binarnie kompatybilny na drucie, tak naprawdę nie powinny być pułapek ... zapoznać się z dokumentacją, aby dowiedzieć się o wersjonowania polityk itd. Jedyne co mogę pomyśl o tym, że przynajmniej w wersji Java dobrze jest, aby pola enum były opcjonalne, i nadawały typowi enum zerową wartość "unknown", która będzie używana, jeśli spróbujesz deserializować nową wartość, która nie jest obsługiwane w kodzie dekorelacyjnym jeszcze.

3

Drobne dodatki do Jona punktów:

  • protobuf netto v1 ma Getaproto, które mogą pomóc w punkcie wyjścia, jednak dla celów międzyoperacyjnych Polecam zaczynając od .proto; protobuf-net może działać tak samo, albo przez "protogen", albo przez dodatek VS
  • poza tym, nie powinieneś mieć problemów tak długo, jak długo będziesz traktował wszystkie pliki jako binarne; otwieranie plików w trybie tekstowym spowoduje nieszczęście
+0

Nie jestem pewien, co to jest różnica? Użyłem Serializer.GetProto , aby uzyskać ciąg znaków, który był doskonale czytelny i wygląda jak plik .proto. – Carlos