If A & B will be fields of your class, so they should be.
example of ArrayList and not Serializable content:
TestClass:
public class NonSerialClass {
private int i;
public NonSerialClass(int i) {
this.i = i;
}
@Override
public String toString() {
return "NonSerialClass{" +
"i=" + i +
'}';
}
}
Runner class:
List<NonSerialClass> nonSerialClasses= new ArrayList<>();
nonSerialClasses.add(new NonSerialClass(1));
nonSerialClasses.add(new NonSerialClass(2));
System.out.println("Before "+nonSerialClasses);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
oos.writeObject(nonSerialClasses);
oos.flush();
oos.close();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream oin = new ObjectInputStream(byteArrayInputStream);
List ts = (List) oin.readObject();
System.out.println("After "+ts);
And result will be:
Before [NonSerialClass{i=1}, NonSerialClass{i=2}]
Exception in thread "main" java.io.NotSerializableException: ru.NonSerialClass
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.util.ArrayList.writeObject(ArrayList.java:766)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)