2015-09-18 7 views
2

Я пытаюсь использовать kryo для сериализации и десериализации в двоичном формате. Я думаю, что у меня работает сериализация, но я не могу десериализовать. Ниже приведен код, с которым я возился, но в конечном итоге я хочу сохранить байт [], а затем прочитать его снова. В документации только показано, как это сделать с файлами.Сериализация/десериализация 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); 
+0

Я думаю, вам нужно указать размер в байтах где-то, как вы бы для выделения массива. Что такое 'b'? – Dici

+0

@ Dici ByteArrayOutputStream. Если я устанавливаю входной поток байта [100], я получаю «Исключение в потоке» main «java.lang.ArrayIndexOutOfBoundsException: -2' в той же строке. – Madmenyo

+0

Вы должны использовать 'toBytes' вместо' getBuffer' (см. Документ http://javadox.com/com.esotericsoftware.kryo/kryo/2.23.0/com/esotericsoftware/kryo/io/Output.html#getBuffer% 28% 29), но я не думаю, что это не то, что вызывает вашу проблему. Что отображается вашим первым «println»? – Dici

ответ

1

Вы сериализации по writeClassAndObject методом и десериализации по readObject, которые не совместимы.

Вы должны использовать либо writeClassAndObject =>readClassAndObject, либо writeObject =>readObject.

Следующие работы для меня (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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^