Search code examples
javakryo

Kryo serialization/deserialization


I'm trying to use kryo to serialize and deserialize to binary. I think I have the serialization working but I cannot seem to deserialize. Below is the code I'm messing around with but eventually I want to store a byte[] and later read it again. The documentation only shows how to do it with files.

        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);

Solution

  • You serialize by writeClassAndObject method and deserialize by readObject which are not compatible.

    You should use either writeClassAndObject => readClassAndObject or writeObject => readObject.

    The following works to me (kryo version 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;
        }
    }