I'm using Kryo 5.2 to serialize the following TreeMap with Comparator:
public class Library {
NavigableMap<Book, String> books = new TreeMap(Book.getComparator());
}
@Getter
@Setter
class Book {
int date;
String author;
public static Comparator<Book> getComparator() {
return Comparator.comparingInt(Book::getDate)
.thenComparing(Book::getAuthor);
}
}
I have tried registering the Library class and using the following Serialization ways, but still get the error
Kryo Serializer
public class Library implements KryoSerializable {
NavigableMap<Book, String> books = new TreeMap(Book.getComparator());
@Override
public void write(Kryo kryo, Output output) {
kryo.writeClassAndObject(output, books);
}
@Override
public void read(Kryo kryo, Input input) {
books = (NavigableMap<Book, String>)kryo.readClassAndObject(input);
}
}
kryo.register(Library.class);
Custom Serializer
class LibrarySerializer extends Serializer<Library> {
@Override
public void write(Kryo kryo, Output output, Library library) {
kryo.writeClassAndObject(output, library.books);
}
@Override
public Library read(Kryo kryo, Input input, Class<Library> type) {
Library library = new Library();
library.books = (NavigableMap<Book, String>)kryo.readClassAndObjcet(input);
return library;
}
}
kryo.register(Library.class, new LibrarySerializer());
P.S. Since I need to cache this object I can't use transient on the Map.