У меня есть сериализованный объект, и я хочу десериализовать его с помощью ObjectInputStream. К сожалению, класс содержит некоторые поля, которые не могут быть десериализованы, потому что они являются лямбдами, и у меня нет соответствующего файла класса в classpath во время десериализации.
Я пытаюсь извлечь информацию из объекта, и меня не интересуют эти лямбда-поля, но некоторые другие поля, которые можно десериализовать (я мог видеть это при отладке через ObjectInputStream.readObject)
Обратите внимание, что я не имею никакого контроля над сериализованным классом (сторонняя библиотека), поэтому использование переходного процесса или любого другого механизма для изменения классов невозможно. Также я не могу изменить процесс сериализации. Все, что у меня есть, это сериализованный объект как строковое представление, с которым мне нужно работать.
Пример:
public interface SomeInterface {
public String doSomething();
}
public class Information {
private String informationIWantToRead;
private SomeInterface someLambdaIDontCareAbout;
}
public class App {
public static void main(String[] args) {
Information information = new Information();
information.setInformationIWantToRead("i want this");
information.setSomeLambdaIDontCareAbout(() -> "dont care about this");
// use ObjectOutputStream to serialize information object and encode as string
}
}
...
public class AppInOtherVM {
public static void main(String[] args) {
// another VM: decode string and deserialize information object using ObjectInputStream
}
}
Когда я десериализую объект с помощью ObjectInputStream.readObject () (и App.class не находится в пути к классам и больше не доступен), выдается исключение ClassCastException:
java.lang.ClassCastException: невозможно назначить экземпляр java.lang.invoke.SerializedLambda полю Information.someLambdaIDontCareAbout типа SomeInterface в случае экземпляра Information
Есть ли способ (использовать пользовательский ObjectInputStream?) Для десериализации этого объекта и игнорирования полей, которые нельзя десериализовать? Я был бы совершенно счастлив, если someLambdaIDontCareAbout имеет значение null.