На основе описания SerialVersionUID здесь: https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100 представляется необходимым всегда включать SerialVersionUID во все создаваемые вами классы, чтобы JVM, используемая для сериализации, и различные JVM, используемые для десериализации, не будут автоматически назначать свои собственные SerialVersionUID, которые могут отличаться друг от друга из-за различий в JVM. Это хорошо работает для управления десериализацией моих собственных классов, но что, если я хочу убедиться, что классы в стандартной библиотеке, сериализованные с помощью JVM A, могут быть десериализованы с помощью JVM B?
Map<Integer, String> myMap = new HashMap<>();
HashMap определяет SerialVersionUID. Но:
- Поскольку HashMap находится в стандартной библиотеке Java, есть ли у меня какие-либо гарантии того, что если я сериализую этот HashMap с помощью JVM A, JVM B сможет его десериализовать? А именно, разрешено ли JVM B указывать SerialVersionUID, отличный от JVM A, по крайней мере, если B является просто обновлением младшей версии от A?
Если это не гарантируется для классов стандартной библиотеки, действительно ли использование SerialVersionUID обеспечивает правильную десериализацию только для ваших собственных классов, которые никогда не касаются стандартной библиотеки Java? Например, класс, который выглядит так:
public class NewClass implements Serializable { private static final long serialVersionUID = 1L; private final Map<Integer, String> myMap; public NewClass() { this.myMap = new HashMap<>(); } }
будет склонен к сбою, потому что десериализация зависит от HashMap, имеющего один и тот же SerialVersionUID, который может быть разным в разных JVM, верно?