【问题标题】:Kryo serialization/deserializationKryo 序列化/反序列化
【发布时间】:2015-09-18 18:24:49
【问题描述】:

我正在尝试使用 kryo 序列化和反序列化为二进制文件。我想我有序列化工作,但我似乎无法反序列化。下面是我正在搞乱的代码,但最终我想存储一个 byte[] 并稍后再次读取它。该文档仅显示如何处理文件。

        Kryo kryo = new Kryo();
        kryo.register(ArrayList.class);
        kryo.register(Modifier.class);

        ByteArrayOutputStream b = new ByteArrayOutputStream();

        Modifier modifier = new Modifier();
        modifier.type = "Yo swa!";
        modifier.amount = 10;

        Output output = new Output(b);
        kryo.writeClassAndObject(output, modifier);

        System.out.println("Kryo size: " + output.toBytes().length);

        Input input = new Input(output.getBuffer());

        //Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 11, Size: 0
        Modifier r = kryo.readObject(input, Modifier.class);
        //Same error:
        Modifier r = kryo.readObject(new Input(new ByteArrayInputStream(output.toBytes())), Modifier.class);

        System.out.println(r.type);

【问题讨论】:

  • 我认为您需要在某处指定字节大小,就像分配数组一样。 b 是什么?
  • @Dici ByteArrayOutputStream。如果我设置说字节 [100] 的输入流,我会在同一行得到 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2
  • 您应该使用toBytes 而不是getBuffer(请参阅文档javadox.com/com.esotericsoftware.kryo/kryo/2.23.0/com/…),但我认为这不是导致您的问题的原因。您的第一个 println 显示什么?
  • @dici 数组的大小 (13)。这可能是对的吗?我正在序列化的类包含另一个 int。
  • @dici 我将错误行更改为:Modifier r = kryo.readObject(new Input(new ByteArrayInputStream(output.toBytes())), Modifier.class); 仍然是相同的错误..

标签: java kryo


【解决方案1】:

您通过writeClassAndObject 方法序列化和通过readObject 反序列化不兼容。

您应该使用writeClassAndObject => readClassAndObjectwriteObject => readObject

以下对我有用(kryo 版本 2.21)。

writeObject =>readObject

package test;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;

public class TestMain {

    public static void main(String[] args) {
        Kryo kryo = new Kryo();
        kryo.register(ArrayList.class);
        kryo.register(Modifier.class);

        ByteArrayOutputStream b = new ByteArrayOutputStream();

        Modifier modifier = new Modifier();
        modifier.type = "Yo swa!";
        modifier.amount = 10;

        Output output = new Output(b);
        kryo.writeObject(output, modifier);
        output.flush();
        output.close();

        System.out.println("Kryo size: " + output.toBytes().length);

        Input input = new Input(output.getBuffer());

        Modifier r = kryo.readObject(input, Modifier.class);

        System.out.println(r.type);
    }

    static class Modifier {
        String type;
        int amount;
    }
}

writeClassAndObject => readClassAndObject

package test;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;

public class TestMain {

    public static void main(String[] args) {
        Kryo kryo = new Kryo();
        kryo.register(ArrayList.class);
        kryo.register(Modifier.class);

        ByteArrayOutputStream b = new ByteArrayOutputStream();

        Modifier modifier = new Modifier();
        modifier.type = "Yo swa!";
        modifier.amount = 10;

        Output output = new Output(b);
        kryo.writeClassAndObject(output, modifier);
        output.flush();
        output.close();

        System.out.println("Kryo size: " + output.toBytes().length);

        Input input = new Input(output.getBuffer());

        Modifier r = (Modifier) kryo.readClassAndObject(input);

        System.out.println(r.type);
    }

    static class Modifier {
        String type;
        int amount;
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2017-01-18
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多