2017-10-18 6 views
0

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(); 
     } 
    } 
+2

すべてのバイトシーケンスは、プラットフォームのデフォルトエンコードでは有効な文字シーケンスではありません。任意のバイトを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を読んでください。/ –

+0

この記事をお寄せいただきありがとうございました。 –

答えて

4

文字列はバイナリデータのコンテナではありません。オリジナルのバイト配列を渡すか、16進または16進コードでエンコードする必要があります。

さらに改善すると、ソケットに直接シリアル化して、これをすべて取り除くことができます。

0

私はそれを理解しました。私は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(); 
     } 
    } 
+0

あなたはbase-64を使用する必要がありませんでした。いくつかの簡単な選択肢があります。 – EJP

+0

どうしたらいいですか?... –

関連する問題