C# Bond: строка в строку

В руководстве по Bond C# он отмечает следующее:

Эти следующие изменения нарушат совместимость проводов и не рекомендуются:

  • Добавление или удаление обязательных полей
  • Несовместимое изменение типов полей (любое изменение типа, не описанное выше); например: int32 в строку, строка в wstring
  • ...

Но это не объясняет почему. В данном случае я использую Bond, который соединяет приложение C# с бэкендом C++. Поле в настоящее время является строкой. Я хочу изменить это на wstring. В руководстве отмечается, что строки C# могут обрабатывать строки C++ и строки C++. Поэтому, почему я не могу просто изменить тип поля со строки на wstring? Почему это разрыв провода Compat?

1 ответ

Решение

В двоичных форматах Bond строки кодируются в UTF8 (без спецификации), а строки w - в кодировке UTF16-LE. Если бы вам пришлось переключить поле со строки на wstring, сторона чтения попыталась бы интерпретировать данные UTF8 как данные UTF16-LE. Эти две кодировки несовместимы друг с другом, поэтому изменение типа поля со строки на wstring является критическим изменением.

Обратите внимание, что в руководстве написано "Например, C# string может представлять любой тип облигации string или же wstringMsgstr "" Это ничего не говорит о типах C++. При работе с Bond через C# и C++ существуют три системы типов: Bond, C# и C++.

Если на стороне C++, вы хотите использовать что-то похожее на std::wstring чтобы сохранить поле в памяти, обратите внимание на использование пользовательского сопоставления типов с концепцией строки.

Другие вопросы по тегам