Protoc не удалось проанализировать ввод, если целочисленное значение больше 127 в Unreal Engine 5 c ++

Среда:

  • Unreal Engine 5
  • Windows 10
  • Буферы протокола v3.18.0

Я пытаюсь декодировать сериализованные данные в Unreal Engine 5 (c++) с помощью protoc. Если сообщение содержит значение int var меньше 127, все в порядке. Но если значение больше 127 ловлю ошибку: Failed to parse input.

player.proto:

      syntax = "proto3";
package com.game;

message Player {
    string username = 1;
    int64 experience = 2;
}

Случай успеха

Сериализация C++ и сохранение в файл:

      com::game::Player MyPlayer;
MyPlayer.set_username("test user name");
MyPlayer.set_experience(127); // <-- PAY ATTENTION

// serialization
std::string MyPlayerString;
if(!MyPlayer.SerializeToString(&MyPlayerString))
{
    UE_LOG(LogGameInstance, Error, TEXT("Can't serialize MyPlayer to String"));
    return;
}
const FString MyPlayerFString(MyPlayerString.c_str());

// save to file
const FString File = *FPaths::Combine(FPaths::GameSourceDir(), FApp::GetProjectName(), TEXT("temp.dat"));
FFileHelper::SaveStringToFile(
    MyPlayerFString,
    *File,
    FFileHelper::EEncodingOptions::AutoDetect,
    &IFileManager::Get()
);

протокол --decode_raw <temp.dat

      1: "test user name"
2: 127

Неудачный случай

Сериализация C++ и сохранение в файл:

      ...
MyPlayer.set_experience(128); // <-- PAY ATTENTION
...

протокол --decode_raw <temp.dat

      Failed to parse input.

Думаю, проблема возникает, когда я пытаюсь конвертировать std::string -> FString. Любые идеи?

1 ответ

Я нашел решение.

Я оставлю это здесь, может, это кому-нибудь поможет. Я изменил реализацию, чтобы избежать преобразования строк.

До:

      ...

// serialization
std::string MyPlayerString;
if(!MyPlayer.SerializeToString(&MyPlayerString))
{
    UE_LOG(LogGameInstance, Error, TEXT("Can't serialize MyPlayer to String"));
    return;
}
const FString MyPlayerFString(MyPlayerString.c_str());

// save to file
const FString File = *FPaths::Combine(FPaths::GameSourceDir(), FApp::GetProjectName(), TEXT("temp.dat"));
FFileHelper::SaveStringToFile(
    MyPlayerFString,
    *File,
    FFileHelper::EEncodingOptions::AutoDetect,
    &IFileManager::Get()
);

После:

      // serialization
const auto MyPlayerSize = MyPlayer.ByteSizeLong();
const auto MyPlayerBytes = new uint8[MyPlayerSize]();
if(!MyPlayer.SerializeToArray(MyPlayerBytes, MyPlayerSize))
{
    UE_LOG(LogGameInstance, Error, TEXT("Can't serialize MyPlayer to Array"));
    return;
}
TArray64<uint8>* MyPlayerArray = new TArray<uint8, FDefaultAllocator64>(MyPlayerBytes, MyPlayerSize);

// save to file
const FString File = *FPaths::Combine(FPaths::GameSourceDir(), FApp::GetProjectName(), TEXT("temp.dat"));
FFileHelper::SaveArrayToFile(
    *MyPlayerArray,
    *File,
    &IFileManager::Get()
);
Другие вопросы по тегам