【问题标题】:java.io.StreamCorruptedException: invalid stream header: 48656C6Cjava.io.StreamCorruptedException:无效的流标头:48656C6C
【发布时间】:2015-02-03 11:59:36
【问题描述】:

我正在使用 netty 客户端服务器进行通信。消息作为字节数组成功接收。当我将字节数组转换为 ObjectInputStream 时出现异常

java.io.StreamCorruptedException: invalid stream header: 48656C6C
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at nettyClientServer2.PongHandler.messageReceived(PongHandler.java:99)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:88)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.doRun(ChannelUpstreamEventRunnable.java:43)
at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:67)
at org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor$ChildExecutor.run(OrderedMemoryAwareThreadPoolExecutor.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

这就是我转换的方式..

byte[] ppBytes=pptmp.status;
ObjectInputStream input = null;
input = new ObjectInputStream(new ByteArrayInputStream(ppBytes));

【问题讨论】:

  • ppBytes的内容是什么?
  • ppBytes 是一个有状态的类,它的数据类型是 byte[]..
  • pptmp.status 可能源自字符串“Hell...”。我猜是“Hello world”.getBytes()。
  • 是的!你正确的劳恩
  • 阅读文档。 ObjectInputStream 用于反序列化序列化对象。你给它纯文本。

标签: java bytearray netty objectinputstream


【解决方案1】:

ppBytes 必须保存序列化对象的字节。请参阅下面的简短示例。

byte[] buffer;
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos)) {
    oos.writeObject("Hello World");
    buffer = bos.toByteArray();
    for (int i : buffer) {
        System.out.printf("%02X ", i & 0xFF);
    }
    System.out.println("");
}

try (ByteArrayInputStream bis = new ByteArrayInputStream(buffer);
        ObjectInputStream ois = new ObjectInputStream(bis)) {
    String input = (String) ois.readObject();
    System.out.println("input: " + input);
}

输出

//                   H  e  l  l  o     W  o  r  l  d
AC ED 00 05 74 00 0B 48 65 6C 6C 6F 20 57 6F 72 6C 64 
input: Hello World

在下面的示例中,缓冲区包含字符串Hello World 的字节表示。使用ObjectInputStream 读取这些字节将失败并使用java.io.StreamCorruptedException: invalid stream header: 48656C6C。作为一个序列化的String 对象是预期的。

byte[] buffer;
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
    bos.write("Hello World".getBytes(StandardCharsets.ISO_8859_1));
    buffer = bos.toByteArray();
    for (int i : buffer) {
        System.out.printf("%02X ", i & 0xFF);
    }
    System.out.println("");
}

try (ByteArrayInputStream bis = new ByteArrayInputStream(buffer);
        ObjectInputStream ois = new ObjectInputStream(bis)) {
    String input = (String) ois.readObject();
    System.out.println("input: " + input);
}

输出

// H  e  l  l  o     W  o  r  l  d
   48 65 6C 6C 6F 20 57 6F 72 6C 64 
   Exception in thread "main" java.io.StreamCorruptedException: invalid \
      stream header: 48656C6C

【讨论】:

    【解决方案2】:

    您可以通过将 String 转换为 byte[] 并再次转换为 String 来做到这一点:

    String hello = "Hello world";
    byte[] bytes = hello.getBytes( "iso-8859-1" );  // or utf-8
    // send
    String world = new String( bytes, "iso-8859-1" ); // or utf-8
    System.out.println( hello );
    System.out.println( world );
    

    读写(String)对象更可靠,绕过了编码/解码赌博:

    String hello = "Hello world";
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream( baos );
    oos.writeUTF( hello );
    oos.flush();
    byte[] bytes = baos.toByteArray();
    // send
    ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
    ObjectInputStream ois = new ObjectInputStream( bais );
    String world = ois.readUTF();
    

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多