Потому что все можно десериализовать обратно в java.lang.Object, поскольку каждый класс в java расширяет java.lang.Object.Если вам удастся сериализовать объект, который имеет несериализуемое поле, вы не сможете узнать класс этого поля при десериализации.Поскольку каждый класс является объектом, вы всегда можете использовать класс Object.
class NonSerializableUser {}
class SerializableUser implements Serializable{}
class SomeObject implements Serializable{
public NonSerializableUser nonUser;
public SerializableUser user;
public Object nonUserObj;
public SomeObject(SerializableUser u, NonSerializableUser uu, NonSerializableUser uuu){
user = u;
nonUser = uu;
nonUserObj = uuu;
}
}
В этом примере десериализация этого класса приведет к тому, что nonUser будет нулевым, пользователь будет правильным экземпляром класса SerializableUser, а nonUserObj будет не нулевым, однако он потеряет все методы и поля NonSerializableClass, они будутне были сериализованы.Единственными частями этого экземпляра, которые сериализуются, являются методы и поля, принадлежащие Object.
Стоит отметить, что многие библиотеки сериализации (например, ObjectOutputStream) будут жаловаться на не сериализуемый класс и не будутсериализуйте этот объект в первую очередь.Вот почему я пропустил детали этапа сериализации / десериализации.Однако многие xml-фреймворки по-прежнему сериализуют эти классы, и это, как правило, та ситуация, когда эта ошибка поднимает свою голову.