当前位置: 首页 > 知识库问答 >
问题:

Kryo序列化/反序列化

穆铭晨
2023-03-14

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

共有1个答案

翁文康
2023-03-14

WriteClassandObject方法序列化和按ReadObject反序列化,这两种方法不兼容。

您应该使用WriteClassandObject=>ReadClassandObjectWriteObject=>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)时,只需添加以下行: