недопустимый заголовок потока: EFBFBDEF при преобразовании объекта из байтовой строки



Я пытаюсь преобразовать объект ArrayList в байтовую строку, чтобы он мог быть отправлен через сокеты. Когда я запускаю этот код, он конвертирует в строку, но когда я пытаюсь преобразовать его обратно, я получаю исключение "Java.Ио.StreamCorruptedException: заголовок неверный поток: EFBFBDEF". Другие ответы, которые я рассматривал здесь, на самом деле не помогли, поскольку я использую соответствующие ObjectOutputStream и ObjectInputStream. Извините, если есть простое исправление, так как я новичок в работе с потоковыми объектами.



try {
ArrayList<String> text = new ArrayList<>();
text.add("Hello World!");
String byteString = Utils.StringUtils.convertToByteString(text);
ArrayList<String> convertedSet = (ArrayList<String>) Utils.StringUtils.convertFromByteString(byteString);
VCS.getServiceManager().addConsoleLog(convertedSet.get(0));
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}

public static String convertToByteString(Object object) throws IOException {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)) {
out.writeObject(object);
final byte[] byteArray = bos.toByteArray();
return new String(byteArray);
}
}

public static Object convertFromByteString(String byteString) throws IOException, ClassNotFoundException {
final byte[] bytes = byteString.getBytes();
try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInput in = new ObjectInputStream(bis)) {
return in.readObject();
}
}
538   2  

2 ответов:

Строка

Не является контейнером для двоичных данных. Вам нужно передать исходный массив байтов, или hex - или base64-кодировать его.

Еще лучше, сериализуйте непосредственно в сокет и полностью избавьтесь от этого.

Я понял это. Мне пришлось использовать кодировку Base64. Методы преобразования должны быть изменены на следующие:

public static String convertToByteString(Object object) throws IOException {
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)) {
            out.writeObject(object);
            final byte[] byteArray = bos.toByteArray();
            return Base64.getEncoder().encodeToString(byteArray);
        }
    }

public static Object convertFromByteString(String byteString) throws IOException, ClassNotFoundException {
        final byte[] bytes = Base64.getDecoder().decode(byteString);
        try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInput in = new ObjectInputStream(bis)) {
            return in.readObject();
        }
    }

Comments

    Ничего не найдено.