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
или же wstring
Msgstr "" Это ничего не говорит о типах C++. При работе с Bond через C# и C++ существуют три системы типов: Bond, C# и C++.
Если на стороне C++, вы хотите использовать что-то похожее на std::wstring
чтобы сохранить поле в памяти, обратите внимание на использование пользовательского сопоставления типов с концепцией строки.