1.) Why does this program work without the no-args constructor? I read somewhere that if you write readObject and writeObject methods in a descendant class, you need a no-args constructor in the parent class. Elsewhere I read that if you want to serialize a (serializable) class whose parent is not serializable, then the parent must have a no-arguments constructor. The way the shared program works proves that neither statement is true. Ultimately then, what is the correct statement, in what cases is a no-args constructor required? Because sometimes you really need it, prg won't work without it. But unfortunately I could not come to any conclusion when it is needed and when it is not. 2.) The output of the shared prg is this: A1, A2, B1, B2 null, null, B1, B2 Question: why does it not load the nameA1 and nameA2 fields of the object? Thanks in advance!:)
import java.io.*;

public class Solution  {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(arrayOutputStream);

        B b1 = new B();
        System.out.println(b1.nameA1 + ", " + b1.nameA2+", " + b1.nameB1+", " + b1.nameB2);


        ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(arrayInputStream);

        B b2 = (B) ois.readObject();
        System.out.println(b2.nameA1 + ", " + b2.nameA2+", " + b2.nameB1+", " + b2.nameB2);

    public static class A {

        public String nameA1;
        public String nameA2;

    //   public A() {
    //    }


    public static class B extends A implements Serializable {

        public String nameB1;
        public String nameB2;

        private void writeObject(ObjectOutputStream out) throws IOException {

        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {