2014-06-30 43 views
7

Używam Kryo do pisania obiektów w tablicach bajtowych. To działa dobrze. Ale gdy tablice bajtów są konwertowane na obiekty, to wyrzuca wyjątek od com.esotericsoftware.kryo.KryoException: Buffer underflow..Deserializacja Kryo kończy się niepowodzeniem z "KryoException: underflow buffer"

To mój deserializacji:

 Kryo k=new Kryo(); 
     Input input=new Input(byteArrayOfObject);   
     Object o=k.readObject(input,ObjectClass.class); 

Ponadto zawsze typ obiektu nie może być zdefiniowana w mojej aplikacji. W ostatecznym procesie następuje konwersja klasy. Dlatego

  • Jak mogę rozwiązać powyższy problem deserializacji

  • Czy istnieje sposób, aby utworzyć obiektu bez podania klasę na readObject (..., className)?

+0

Mam do czynienia z tym samym problemem? Czy to rozwiązało? Próbowałem poniżej sugestii, nie pomógł .. – Sharath

Odpowiedz

9

Zdarzyło się to, gdy nie zamykałem prawidłowo typów wyjściowych/wejściowych. Musisz upewnić się, że Kryo spłukuje wszystko, ale robi output.flush() lub output.close().

Po drugie, spójrz na kryo.writeClassAndObject(). Możesz następnie wykonać kryo.readClassAndObject() i rzucić obiekt na typ, który ma być.

1

To stało się dla mnie, gdy użyłem serializera w wielu wątkach. Nie jest to bezpieczne dla wątków, więc jeśli użyjesz go w ten sposób, może to spowodować "niedopełnienie bufora" lub inne wyjątki.

+0

Ten pomysł jest econe przez odpowiedź tutaj: https://github.com/EsotericSoftware/kryo/issues/128#issuecomment-28249144 –

1

Widziałem ten błąd z powodu prawdziwego problemu serializacji Java; Moja definicja klasy nie była taka sama po stronie producenta i konsumenta (dwie różne aplikacje), w wyniku czego otrzymałem ten wyjątek.

Po prostu chciałem zostawić to jako FYI, jeśli jeszcze tego nie sprawdziłeś.