在Kafka Consumer中反序列化protostuff对象的问题

时间:2016-11-11 11:12:59

标签: java apache-kafka kafka-consumer-api kafka-producer-api protostuff

在将字节[]反序列化为Kafka Consumer

中的protostuff对象时获取以下异常
java.lang.NegativeArraySizeException
at com.dyuproject.protostuff.GraphIOUtil.mergeDelimitedFrom(GraphIOUtil.java:209)
at com.gme.protocols.protostuff.GmeTrade.readExternal(GmeTrade.java:2772)
at java.io.ObjectInputStream.readExternalData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)

使用以下代码将protostuff对象转换为byte []。

public static byte[] toBytes(Object o)
{
    try
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(o);
        oos.close();
        byte[] b = baos.toByteArray();
        return b;
    }
    catch (IOException e)
    {
        return new byte[0];
    }
}

使用主题为“XX”的Kafka制作人发送了该字节[],其中byte []长度仅为240。 使用Kafka消费者收到该记录。 record.value()。length(byte [])长度与我从生产者端发送的长度相同。

使用以下代码将byte []反序列化为对象。

public static Object fromBytes(byte[] bytes)
{
    try
    {
        return new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return null;
    }
}

获得上述异常。我做错了什么? 使用kafka_2.11-0.9.0.0作为参考。还需要其他东西吗?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。 toBytes和fromBytes存在问题。 需要使用ProtostuffIOUtil.toByteArray方法将其转换为byte []。

<强>序列化

public static byte[] toBytes(Foo o)
{
  LinkedBuffer BUFFER = LinkedBuffer.allocate(1024*1024);
  Schema<Foo> SCHEMA = Foo.getSchema();
  return ProtostuffIOUtil.toByteArray(o, SCHEMA, BUFFER);
}

再次需要使用ProtostuffIOUtil.mergeFrom方法将byte []转换为对象。

<强>反序列化

public static Foo fromBytes(byte[] bytes)
{
  Foo tmp = Foo.getSchema().newMessage();
  ProtostuffIOUtil.mergeFrom(bytes, tmp, Foo.getSchema());
  return tmp;
}

注意:使用ObjectOutputStream / ObjectInputStream进行序列化/反序列化不适用于protostuff对象。