1. Ведь при создании объекта Solution solution = new Solution(); при десереализации мы не даем аргумент этому методу objectInputStream.readObject();, а вот уже при сереализации у нас objectOutputStream.writeObject(solution); с аргументом. 2. А второй вопрос почему можно использовать writeObject(Object obj) и writeObject(ObjectOutputStream obj) , мы разве в метод writeObject(добавляем поток?)
public class Solution implements Serializable {
    public static class SubSolution extends Solution {
       private void readObject() throws NotSerializableException {
            throw new NotSerializableException();
        }
       }

    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Solution solution = new Solution();
        FileInputStream fileInputStream = new FileInputStream("");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        Solution newSolution = objectInputStream.readObject();

        FileOutputStream fileOutputStream = new FileOutputStream("");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(solution);
    }