As I understand it, writeObject() can only work with built-in types by default, like Number, Boolean, int, uint, String, Object, and Array. However, you can get it to support custom classes by passing them to registerClassAlias. If a custom class contains nests other custom classes, you need to register them all.
So I assume that you need to call registerClassAlias() for both SceneFile and Camera3D.
Honestly, this is not something that I've done very often. I know it's possible, but I don't remember all of the details from the rare times that I've had to do it. Maybe someone more experienced with readObject/writeObject/AMF will be able to help.