gpt4 book ai didi

java - Kryo 序列化/反序列化

转载 作者:行者123 更新时间:2023-11-30 08:47:04 28 4
gpt4 key购买 nike

我正在尝试使用 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);

最佳答案

你用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;
}
}

关于java - Kryo 序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658684/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com