JDK-8209317 : Deprecate serialVersionUID fields in interfaces
  • Type: CSR
  • Component: security-libs
  • Priority: P4
  • Status: Closed
  • Resolution: Approved
  • Fix Versions: 12
  • Submitted: 2018-08-09
  • Updated: 2018-08-17
  • Resolved: 2018-08-17
Related Reports
CSR :  
Description
Summary
-------

Deprecate ineffectual `serialVersionUID` fields on various interface types in the security libraries and elsewhere.

Problem
-------

Since the `serialVersionUID` in question are ineffectual, use of them is misleading and should be discouraged by deprecating the fields.

Solution
--------
Deprecate the 20 ineffectual `serialVersionUID` fields. It is not necessary to deprecate them for removal.

Specification
-------------

Deprecate the following 20 `serialVersionUID` fields:

    --- old/src/java.base/share/classes/java/security/Key.java	2018-08-09 11:18:34.372000999 -0700
    +++ new/src/java.base/share/classes/java/security/Key.java	2018-08-09 11:18:34.228000999 -0700
    @@ -108,8 +108,12 @@
         * The class fingerprint that is set to indicate
         * serialization compatibility with a previous
         * version of the class.
    +    *
    +    * @deprecated A {@code serialVersionUID} field in an interface is
    +    * ineffectual. Do not use; no replacement.
         */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 6603384152749567654L;
     
         /**
    --- old/src/java.base/share/classes/java/security/PrivateKey.java	2018-08-09 11:18:34.760000999 -0700
    +++ new/src/java.base/share/classes/java/security/PrivateKey.java	2018-08-09 11:18:34.608000999 -0700
    @@ -63,7 +63,11 @@
         /**
          * The class fingerprint that is set to indicate serialization
          * compatibility with a previous version of the class.
    -     */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
    +      */
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 6034044314589513430L;
     }
    --- old/src/java.base/share/classes/java/security/PublicKey.java	2018-08-09 11:18:35.144000999 -0700
    +++ new/src/java.base/share/classes/java/security/PublicKey.java	2018-08-09 11:18:35.000000999 -0700
    @@ -49,7 +49,11 @@
         /**
          * The class fingerprint that is set to indicate serialization
          * compatibility with a previous version of the class.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 7187392471159151072L;
     }
    --- old/src/java.base/share/classes/java/security/interfaces/DSAPrivateKey.java	2018-08-09 11:18:35.528000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/DSAPrivateKey.java	2018-08-09 11:18:35.380000999 -0700
    @@ -47,8 +47,12 @@
         * The class fingerprint that is set to indicate
         * serialization compatibility with a previous
         * version of the class.
    +    *
    +    * @deprecated A {@code serialVersionUID} field in an interface is
    +    * ineffectual. Do not use; no replacement.
         */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 7776497482533790279L;
     
         /**
    --- old/src/java.base/share/classes/java/security/interfaces/DSAPublicKey.java	2018-08-09 11:18:35.900000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/DSAPublicKey.java	2018-08-09 11:18:35.752000999 -0700
    @@ -47,8 +47,12 @@
         * The class fingerprint that is set to indicate
         * serialization compatibility with a previous
         * version of the class.
    +    *
    +    * @deprecated A {@code serialVersionUID} field in an interface is
    +    * ineffectual. Do not use; no replacement.
         */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 1234526332779022332L;
     
         /**
    --- old/src/java.base/share/classes/java/security/interfaces/ECPrivateKey.java	2018-08-09 11:18:36.284000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/ECPrivateKey.java	2018-08-09 11:18:36.136000999 -0700
    @@ -42,8 +42,12 @@
        /**
         * The class fingerprint that is set to indicate
         * serialization compatibility.
    +    *
    +    * @deprecated A {@code serialVersionUID} field in an interface is
    +    * ineffectual. Do not use; no replacement.
         */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -7896394956925609184L;
     
         /**
    --- old/src/java.base/share/classes/java/security/interfaces/ECPublicKey.java	2018-08-09 11:18:36.656000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/ECPublicKey.java	2018-08-09 11:18:36.512000999 -0700
    @@ -44,8 +44,12 @@
        /**
         * The class fingerprint that is set to indicate
         * serialization compatibility.
    +    *
    +    * @deprecated A {@code serialVersionUID} field in an interface is
    +    * ineffectual. Do not use; no replacement.
         */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -3314988629879632826L;
     
         /**
    --- old/src/java.base/share/classes/java/security/interfaces/RSAMultiPrimePrivateCrtKey.java	2018-08-09 11:18:37.024000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/RSAMultiPrimePrivateCrtKey.java	2018-08-09 11:18:36.884000999 -0700
    @@ -50,8 +50,12 @@
          * The type fingerprint that is set to indicate
          * serialization compatibility with a previous
          * version of the type.
    +    *
    +    * @deprecated A {@code serialVersionUID} field in an interface is
    +    * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 618058533534628008L;
     
         /**
    --- old/src/java.base/share/classes/java/security/interfaces/RSAPrivateCrtKey.java	2018-08-09 11:18:37.404000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/RSAPrivateCrtKey.java	2018-08-09 11:18:37.252000999 -0700
    @@ -45,8 +45,12 @@
          * The type fingerprint that is set to indicate
          * serialization compatibility with a previous
          * version of the type.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -5682214253527700368L;
     
         /**
    --- old/src/java.base/share/classes/java/security/interfaces/RSAPrivateKey.java	2018-08-09 11:18:37.768000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/RSAPrivateKey.java	2018-08-09 11:18:37.624000999 -0700
    @@ -44,8 +44,12 @@
          * The type fingerprint that is set to indicate
          * serialization compatibility with a previous
          * version of the type.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 5187144804936595022L;
     
         /**
    --- old/src/java.base/share/classes/java/security/interfaces/RSAPublicKey.java	2018-08-09 11:18:38.136000999 -0700
    +++ new/src/java.base/share/classes/java/security/interfaces/RSAPublicKey.java	2018-08-09 11:18:37.988000999 -0700
    @@ -41,8 +41,12 @@
          * The type fingerprint that is set to indicate
          * serialization compatibility with a previous
          * version of the type.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -8727434096241101194L;
     
         /**
    --- old/src/java.base/share/classes/javax/crypto/SecretKey.java	2018-08-09 11:18:38.508000999 -0700
    +++ new/src/java.base/share/classes/javax/crypto/SecretKey.java	2018-08-09 11:18:38.368000999 -0700
    @@ -63,7 +63,11 @@
         /**
          * The class fingerprint that is set to indicate serialization
          * compatibility since J2SE 1.4.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -4795878709595146952L;
     }
    --- old/src/java.base/share/classes/javax/crypto/interfaces/DHPrivateKey.java	2018-08-09 11:18:38.884000999 -0700
    +++ new/src/java.base/share/classes/javax/crypto/interfaces/DHPrivateKey.java	2018-08-09 11:18:38.740000999 -0700
    @@ -41,8 +41,12 @@
         /**
          * The class fingerprint that is set to indicate serialization
          * compatibility since J2SE 1.4.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 2211791113380396553L;
     
         /**
    --- old/src/java.base/share/classes/javax/crypto/interfaces/DHPublicKey.java	2018-08-09 11:18:39.248000999 -0700
    +++ new/src/java.base/share/classes/javax/crypto/interfaces/DHPublicKey.java	2018-08-09 11:18:39.108000999 -0700
    @@ -41,8 +41,12 @@
         /**
          * The class fingerprint that is set to indicate serialization
          * compatibility since J2SE 1.4.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -6628103563352519193L;
     
         /**
    --- old/src/java.base/share/classes/javax/crypto/interfaces/PBEKey.java	2018-08-09 11:18:39.624000999 -0700
    +++ new/src/java.base/share/classes/javax/crypto/interfaces/PBEKey.java	2018-08-09 11:18:39.480000999 -0700
    @@ -41,8 +41,12 @@
         /**
          * The class fingerprint that is set to indicate serialization
          * compatibility since J2SE 1.4.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -1430015993304333921L;
     
         /**
    --- old/src/java.base/share/classes/sun/security/internal/interfaces/TlsMasterSecret.java	2018-08-09 11:18:39.996000999 -0700
    +++ new/src/java.base/share/classes/sun/security/internal/interfaces/TlsMasterSecret.java	2018-08-09 11:18:39.856000999 -0700
    @@ -44,7 +44,12 @@
     @Deprecated
     public interface TlsMasterSecret extends SecretKey {
     
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    /***
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
    +     */
    +    @Deprecated
    +    @SuppressWarnings("serial")
         public static final long serialVersionUID = -461748105810469773L;
     
         /**
    --- old/src/java.naming/share/classes/javax/naming/Name.java	2018-08-09 11:18:40.364000999 -0700
    +++ new/src/java.naming/share/classes/javax/naming/Name.java	2018-08-09 11:18:40.224000999 -0700
    @@ -63,8 +63,12 @@
         * The class fingerprint that is set to indicate
         * serialization compatibility with a previous
         * version of the class.
    +    *
    +    * @deprecated A {@code serialVersionUID} field in an interface is
    +    * ineffectual. Do not use; no replacement.
         */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -3617482732056931635L;
     
         /**
    --- old/src/java.naming/share/classes/javax/naming/directory/Attribute.java	2018-08-09 11:18:40.732000999 -0700
    +++ new/src/java.naming/share/classes/javax/naming/directory/Attribute.java	2018-08-09 11:18:40.588000999 -0700
    @@ -335,7 +335,11 @@
     
         /**
          * Use serialVersionUID from JNDI 1.1.1 for interoperability.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
          */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 8707690322213556804L;
     }
    --- old/src/java.rmi/share/classes/java/rmi/server/RemoteRef.java	2018-08-09 11:18:41.100000999 -0700
    +++ new/src/java.rmi/share/classes/java/rmi/server/RemoteRef.java	2018-08-09 11:18:40.952000999 -0700
    @@ -38,8 +38,13 @@
      */
     public interface RemoteRef extends java.io.Externalizable {
     
    -    /** indicate compatibility with JDK 1.1.x version of class. */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    /** indicate compatibility with JDK 1.1.x version of class.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
    +     */
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = 3632638527362204081L;
     
         /**
    --- old/src/java.rmi/share/classes/java/rmi/server/ServerRef.java	2018-08-09 11:18:41.464000999 -0700
    +++ new/src/java.rmi/share/classes/java/rmi/server/ServerRef.java	2018-08-09 11:18:41.324000999 -0700
    @@ -38,8 +38,13 @@
     @Deprecated
     public interface ServerRef extends RemoteRef {
     
    -    /** indicate compatibility with JDK 1.1.x version of class. */
    -    @SuppressWarnings("serial") // serialVersionUID in an interface is ineffectual
    +    /** indicate compatibility with JDK 1.1.x version of class.
    +     *
    +     * @deprecated A {@code serialVersionUID} field in an interface is
    +     * ineffectual. Do not use; no replacement.
    +     */
    +    @Deprecated
    +    @SuppressWarnings("serial")
         static final long serialVersionUID = -4557750989390278438L;
     
         /**



Comments
Moving to Approved.
17-08-2018

Reviewed. I'm ok with ordinary deprecation at this point. However, it might be reasonable to consider terminal deprecation and eventual removal. The actual compatibility risk is small, I think, and it would reduce the size of the runtime by a small amount and clean up some clutter in the specs.
17-08-2018