Kryo序列化/反序列化

4

我正在尝试使用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
@Dici ByteArrayOutputStream。如果我设置一个输入流,比如byte[100],我会在同一行上得到一个“Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2”。 - Madmenyo
@dici 我将错误行改为以下内容:Modifier r = kryo.readObject(new Input(new ByteArrayInputStream(output.toBytes())), Modifier.class); 但仍然出现相同的错误... - Madmenyo
你正在使用 writeClassAndObject,但是却用 readObject 进行读取。你应该使用 writeObject 进行写入或者使用 readClassAndObject 进行读取。 - Dici
我不知道Kryo压缩得那么好。我知道它更快,更灵活(不需要将所有类标记为“Serializable”,拥有用于简单数据对象的默认序列化程序等)。 - Dici
显示剩余4条评论
1个回答

6
您可以通过writeClassAndObject方法进行序列化,但是使用readObject方法进行反序列化会出现不兼容的情况。
建议您改用writeClassAndObject => readClassAndObject 或者writeObject => 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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接