Игнорировать поля при десериализации объекта, чтобы избежать ClassCastException - PullRequest
0 голосов
/ 09 июля 2019

У меня есть сериализованный объект, и я хочу десериализовать его с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...