Десериализация строковых байтов в битовый поток

#c# #unity3d

#c# #unity3d

Вопрос:

Моя проблема заключается в следующем: я сериализую данные и отправляю их в PlayerPrefs

 BitStream bitStream = new BitStream(isTypeSafe);
        bitStream.WriteByte(species);
        bitStream.WriteInt32(revision);
PlayerPrefs.SetString(species.ToString(), bitStream.ToString());
  

и затем я пытаюсь десериализовать данные:

 BitStream bitStream = new BitStream(isTypeSafe);
bitStream.WriteString(PlayerPrefs.GetString(species.ToString()));
species = bitStream.ReadByte();
revision = bitStream.ReadInt32();
  

Но на выходе я получаю неверные данные. Что я делаю не так?

Ответ №1:

Основная проблема здесь заключается в том, что вы используете строки в качестве хранилища двоичных данных. Это неправильно, потому что может произойти изменение кодировки строки, что приведет к повреждению ваших данных. К сожалению, PlayerPrefs не предоставляет никакого способа сохранения / загрузки двоичных данных. Таким образом, решением было бы использовать вместо этого текстовую сериализацию.

PS Это выглядит некорректно:

 bitStream.WriteString(PlayerPrefs.GetString(species.ToString()));
  

Комментарии:

1. Я не совсем понимаю ваш ответ. Не могли бы вы привести пример кода? Предпочтения игрока. SetInt не подходит, в моей строке хранятся байты.

2. Какие значения могут species принимать? Если только несколько, то PlayerPrefs.SetInt подходит идеально. Если их много (или если вам нужно универсальное решение), то да, вам нужна сериализация. Но BitStream это неправильный выбор. Я бы также сказал, что двоичная сериализация также является неправильным выбором. Я бы рекомендовал использовать какую-то текстовую сериализацию (например, XML или JSON).

3. У меня много разных типов, а не один Int. Но мне нужен только битовый поток, и я не знаю, как в моем случае, правильная проблема десериализуется.

4. Почему вам «нужен только битовый поток»?

5. Одна вещь. О чем мы говорим UnityEngine.BitStream ?