Kryo - Serialization of TreeMap with a Comparator - InaccessibleObjectException: Unable to make field private final java.util.Comparator

77 views Asked by At

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.

0

There are 0 answers