I get it why the Logger and PrintStream fields must be transient. Can anyone explain me briefly why the fullName and greeting fields have to be transient, too? (regarding "final" modifier the Professors' article said: "Second, you should also pay attention to variables with the final modifier. When you use Serializable, they are serialized and deserialized as usual, but when you use Externalizable, it is impossible to deserialize a final variable! ") I guess it has to do with the default constructor not being able to initialize these fields(?) but I don't fully understand. Thanks in advance!
public class Solution {

    public static class Person implements Serializable {
        String firstName;
        String lastName;
        String fullName;
        final String greeting;
        String country;
        Sex sex;
        transient PrintStream outputStream;
        transient Logger logger;

        Person(String firstName, String lastName, String country, Sex sex) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.fullName = String.format("%s, %s", lastName, firstName);
            this.greeting = "Hello, ";
            this.country = country;
            this.sex = sex;
            this.outputStream = System.out;
            this.logger = Logger.getLogger(String.valueOf(Person.class));
        }
    }

    enum Sex {
        MALE,
        FEMALE
    }

    public static void main(String[] args) {

    }
}