Я пытаюсь понять механизм сериализации Java, и у меня мало сомнений
Пожалуйста, ответьте на следующие вопросы, касающиеся сериализации Java:
- Почему мы используем
oos.defaultWriteObject();
? Согласно этот пост есть для обратной совместимости. И я не совсем понимаю, как это достигается. Одним из несовместимых изменений для сериализации является удаление поля в более новой версии. Это означает, что более старые версии должны будут устанавливать значения по умолчанию, которые иногда недействительны для пользователя. Чем это отличается от более новых версий, добавляющих новое поле и позволяющих устанавливать значения по умолчанию? - во время пользовательской сериализации имеет ли значение использование как
oos.defaultWriteObject();
, так иoos.writeObject(address);
, разве оба они не делают одно и то же? Я имею в виду, что оба записывают непереходные нестатические поля всех суперклассов и текущего класса в OOS.
здесь
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.writeObject(name);
stream.writeInt(id);
stream.writeObject(DOB);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
name = (String) stream.readObject();
id = stream.readInt();
DOB = (String) stream.readObject();
}
приведенный выше код дает тот же результат, что и приведенный ниже код
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.defaultWriteObject();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
}
когда использовать эти 2 метода, когда использовать только writeObject(employee);//employee — это весь мой объект//
- вот список возможных повторяющихся вопросов, которые не отвечают на мой вопрос.
- вопрос 1 он говорит * Если defaultWriteObject или writeFields не вызываются один раз перед записью необязательных данных (если они есть), то поведение десериализации экземпляра не определено в случаях, когда ObjectInputStream * но я все еще могу вызвать writeObject без использования deafultwriteobject.right ?
- вопрос 2 эти ответы говорят, что метод defaultwriteobject записывает некоторые дополнительные данные в поток, и это рефлективно проверяет, что писать. разве oos.writeobject(object obj) также не выполняет рефлексивную проверку?
- Наконец-то я могу получить контроль над своей сериализацией, переопределив методы writeObject и ReadObject, тогда в чем смысл Externalizable?
- Если предоставление серийного номера versionUID не вызывает исключение, что произойдет, если я десериализую объект с отсутствующим полем из более старого класса, в котором есть это поле, в основном, что произойдет со всеми несовместимыми изменениями, если я предоставлю свой собственный SerialverUID? есть ли у него собственный UID серийной версии, который не будет вызывать исключение streamcorrupted для всех совместимых изменений?
writeObject()
, но это еще не все. Он вызывается внутри пользовательского методаwriteObject()
, когда вам нужны действия сериализации по умолчанию плюс некоторые ваши собственные. Все это задокументировано. Когда вы вызываете его вне этого контекста, как у вас, вы получаете это исключение. Это также задокументировано. Как и все остальное, о чем вы спрашивали. См. Спецификацию сериализации объектов. - person user207421   schedule 20.12.2019