-
-
Notifications
You must be signed in to change notification settings - Fork 842
Description
We are upgrading our code-base from Kryo 4.0.2 to 5.4.0, and have hit an issue when serialising a Collection that only contains instances of Collections$UnmodifiableRandomAccessList.
We have sub-classed Kryo to support serialising classes with writeResolve and readReplace methods; UnmodifiableRandomAccessList implements writeResolve like this:
private Object writeReplace() {
return new UnmodifiableList<>(list);
}Kryo 5's CollectionSerializer seems to have an optimisation for the case when all of a collection's elements are of the same type, whereby Kryo serializes the element type once, and then serializes all of the elements' object data afterwards. Unfortunately, UnmodifiableRandomAccessList.writeResolve transforms the elements into instances of UnmodifiableList, but Kryo is unable to discover this until it has invoked writeResolve at least once. This happens after it has incorrectly written UnmodifiableRandomAccessList as the element type to the output stream, of course.
I cannot see a way of working around this apart from ignoring UnmodifiableRandomAccessList.writeResolve, although I cannot ignore every writeResolve method because that would break lambda serialization. Ideally, I'd like to be able to configure CollectionsSerializer not to apply this optimisation at all.