Я использую com.google.protobuf.ByteString и пытаюсь сериализовать его, чтобы сохранить в виде строки.
String value = Arrays.toString(byteString.toByteArray());
Теперь я хочу перевернуть его и превратить обратно в byteString.
byte[] byteArray = value.getBytes(); ??
ByteString.copyFrom(byteArray);
Я сомневаюсь, что это сработает. Пример ByteString в строковом формате с использованием первой строки выше выглядит следующим образом [0, 0, 0, 0, 1, -118, 7, -52, 0, 0]. И это нормально, я не против хранить это. Кажется, что эти символы полностью представлены в виде чисел. Теперь я хочу отменить это, чтобы воссоздать ByteString. Проблема в том, что я не знаю, как преобразовать его обратно в массив байтов и отменить Arrays.toString(byte[]).
Изначально я не знаю кодировку массива байтов. Это из идентификатора воспроизведения Salesforce. У меня также нет простого способа сохранить его в виде байтовых данных. Есть ли какой-нибудь необычный Arrays.UndoString() или мне нужно написать свою собственную функцию?
@markspace это скорее вопрос о том, как отменить Arrays.toString(byte[]). Я просто привел пример кода для идеи. Невозможно, чтобы string.getBytes() работал, поскольку он использует кодировку по умолчанию.
@markspace создание класса не решит мою проблему сериализации массива байтов. Мне нужно сохранить его как строку. Мне также нужно его десериализовать.
На самом деле ваш com.google.protobuf.ByteString
— это Serializable
, поэтому наиболее безопасным для вас подходом будет его сериализация и последующее применение к нему одной из альтернатив @Sören. Таким образом, вы можете реализовать свою амбицию: «Теперь я хочу обратить это вспять, чтобы воссоздать ByteString».
Arrays.toString
на самом деле не предназначен для отмены. Конечно, вы могли бы написать для этого парсер. Но зачем, если есть альтернативы?
Альтернатива 1: Base64
Использовать
import java.util.Base64;
Base64.getEncoder().encodeToString(yourarray)
чтобы преобразовать ваш массив в строку и
Base64.getDecoder().decode(yourstring)
чтобы вернуть массив.
Альтернатива 2: JSON
В результате получаются более читаемые строки, но требуется внешняя библиотека, которой много. Поэтому я не буду приводить здесь пример кода.
Кодировка Base64 может работать. Я попробую.
Большинство вложений байтовых массивов будет осуществляться в формате BaseSomething, наиболее распространенным из них является Base16.
Да, это сработало, я чувствую себя глупо, потому что не подумал об этом.
Я думаю, во-первых, вам следует протестировать свой код, чтобы убедиться, что он работает. Публикация непроверенного кода скорее не уважает время тех, кто пытается ответить. Однако в этом случае я бы рассмотрел возможность определения собственного класса, который имел бы как строку Java, так и исходную строку байтов. Это позволяет избежать проблемы перевода обратно.
class MyString { private String s; private ByteString b; //etc. }