ArrayListオブジェクトをバイト文字列に変換しようとしているため、ソケット経由で送信できます。このコードを実行すると、文字列に変換されますが、変換を試みると例外 "java.io.StreamCorruptedException:無効なストリームヘッダー:EFBFBDEF"が返されます。私がここで見た他の答えは、一致するObjectOutputStreamとObjectInputStreamを使用しているので、実際には役に立たなかった。ストリームオブジェクトを扱うのが初めてのので、単純な修正がある場合は申し訳ありません。無効なストリームヘッダー:バイト文字列からオブジェクトを変換するときのEFBFBDEF
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();
}
}
すべてのバイトシーケンスは、プラットフォームのデフォルトエンコードでは有効な文字シーケンスではありません。任意のバイトをStringに変換しないでください。ちょうどバイトの配列を使用してください。印刷可能なものが本当に必要な場合は、base64エンコーディングを使用して、バイト配列を印刷可能な文字列に変換します。 https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excusesを読んでください。/ –
この記事をお寄せいただきありがとうございました。 –