Closed Chuqiaoo closed 3 years ago
@Chuqiaoo: Kryo is not a drop-in replacement for standard Java serialization. It supports almost all built-in JDK classes and can serialize most POJOs you throw at it, but it may need help with complex data structures.
It might be enough to write your own serializer for AtomicReferenceArrayListAdapter
. It extends AbstractList
so Kryo's default CollectionSerializer
is used. It uses Objensis to instantiate the class and the backing array in AtomicReferenceArrayListAdapter
is null after instantiation leading to your NPE.
Implement a custom serializer for this class that serializes the backing array and correctly instantiates the class with the array upon deserialization.
Alternatively, you should be able to force Kryo to use FieldSerializer
for this class:
kryo.register(AtomicReferenceArrayListAdapter.class, new FieldSerializer<>(kryo, AtomicReferenceArrayListAdapter.class));
Alternatively, you should be able to force Kryo to use
FieldSerializer
for this class:kryo.register(AtomicReferenceArrayListAdapter.class, new FieldSerializer<>(kryo, AtomicReferenceArrayListAdapter.class));
it really helps a lot, thank you so much, even though I already set setRegistrationRequired to false, still have to register AtomicReferenceArrayListAdapter.class because it is not built-in JDK classes, is that correct?
even though I already set setRegistrationRequired to false, still have to register AtomicReferenceArrayListAdapter.class because it is not built-in JDK classes, is that correct?
No, you don't have to register it. The problem with AtomicReferenceArrayListAdapter
is that Kryo's default registration for this class is CollectionSerializer
(because it implements List
). And CollectionSerializer
does not know how to create a valid new instance of AtomicReferenceArrayListAdapter
.
The code I suggested overrides Kryo's default registration and tells it to use FieldSerializer
instead of CollectionSerializer
. FieldSerializer
uses reflection to read/write all fields of the class and that works in your case.
even though I already set setRegistrationRequired to false, still have to register AtomicReferenceArrayListAdapter.class because it is not built-in JDK classes, is that correct?
No, you don't have to register it. The problem with
AtomicReferenceArrayListAdapter
is that Kryo's default registration for this class isCollectionSerializer
(because it implementsList
). AndCollectionSerializer
does not know how to create a valid new instance ofAtomicReferenceArrayListAdapter
.The code I suggested overrides Kryo's default registration and tells it to use
FieldSerializer
instead ofCollectionSerializer
.FieldSerializer
uses reflection to read/write all fields of the class and that works in your case.
ok, I get your point, your suggestion is very helpful and thank you for your reply.
I got nullPointerException when Kryo deserialization, serialize the data and write into a file, works no exception, but exception is found when deserialize the content from a file.
Kryo version: 5.0.4 Concurrent tress: 2.6.1 JDK: 11 Spring: 5 Test code:
Exception: