我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。
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
=>ReadClassandObject
或WriteObject
=>ReadObject
。
下面的工作对我(kryo版本2.21)。
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;
}
}
我对Kafka和克里奥很陌生。我一直在使用默认的Kafka序列化器处理Kafka上的简单字符串消息,但我试图使用Kryo序列化,但没有成功。 谁能解释一下或者给我看一个用kryo序列化(生产者和消费者)通过Kafka发送java对象的例子吗?
启用Kryo和FST 使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可: <dubbo:protocol name="dubbo" serialization="kryo"/> <dubbo:protocol name="dubbo" serialization="fst"/> 注册被序列化类 要让Kryo和FST完全发挥出高性能,最好将那些需要被序列化的
我在程序中使用,需要序列化内核以便以后重用它们。 为此,我使用: 如何定义必须使用?
问题内容: 我尝试过在Java和Android之间实现跨平台序列化。我使用了Serializable,并将我的代码在Android中与台式机Java放在同一软件包中。 来源:java-desktop序列化 资料来源:Android-反序列化 学生是一类,实现了Serializable。在桌面上,我将学生实例序列化为“ thestudent.dat”。我将此文件放在Android设备上的SD卡上,并
问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加
问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行: