Так просто, одним куском кода, это сделать нельзя. readObjectNoData() работает только на враждебных данных, которые ещё надо ухитриться сфабриковать.
// Пишет вот такой код
class A implements Serializable { }
class B extends A {}
// А читает вот такой
class A implements Serializable { }
class AHalf extends A {
private void readObjectNoData() throws ObjectStreamException {}
}
class B extends AHalf {}
Если записать объект класса B первым кодом и прочитать вторым, должно сработать.
Смысл readObjectNoData() — привести объект в подходящее состояние, когда 1) данных по промежуточному классу AHalf нет; 2) у него какие-то нехорошие инварианты, что так просто в свежеинициализированном состоянии он негодный: ну, к примеру, конструктор по умолчанию скрыт и служит только для десериализации, а так он просит объект для своего создания.