8028027: serialver should emit declaration with the 'private' modifier
Stuart Marks
stuart.marks at oracle.com
Fri Nov 8 18:47:59 UTC 2013
On 11/8/13 7:20 AM, Yuri Gaevsky wrote:
>> Well, it would be more consistent to check for existence of protected or public serialVersionUID with Reflection API and change the serialver output accordingly.
>
> Please see suggested fix and its output below.
This change isn't consistent with the intent of the 'serialver' utility. Its
intent is to produce a declaration that's "suitable for copying into an evolving
class." [1] (Clearly, this means the source code of a class.) The spec [2]
"strongly advises" that serialVersionUID be private. As such, serialver should
follow the strong advice given in the spec.
If there happens to be a declaration in the class that, probably mistakenly,
goes against this advice, serialver shouldn't emit a line that perpetuates this
mistake.
One can use "javap -v" to determine the presence of serialVersionUID field,
including its modifiers, if that's what's desired.
s'marks
[1] http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/serialver.html
[2] http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
>
> Thanks,
> -Yuri
>
> $ serialver java.security.PublicKey
> java.security.PublicKey: public static final long serialVersionUID = 7187392471159151072L;
>
> $ serialver java.lang.Exception
> java.lang.Exception: static final long serialVersionUID = -3387516993124229948L;
>
> $ serialver java.lang.AssertionError
> java.lang.AssertionError: private static final long serialVersionUID = -5013299493970297370L;
>
> $ serialver javax.xml.ws.soap.SOAPFaultException
> javax.xml.ws.soap.SOAPFaultException: private static final long serialVersionUID = -104968645459360720L;
>
>
> $ hg diff
> diff --git a/src/share/classes/sun/tools/serialver/SerialVer.java b/src/share/classes/sun/tools/serialver/SerialVer.java
> --- a/src/share/classes/sun/tools/serialver/SerialVer.java
> +++ b/src/share/classes/sun/tools/serialver/SerialVer.java
> @@ -38,6 +38,7 @@
> import java.net.MalformedURLException;
> import java.util.StringTokenizer;
> import sun.net.www.ParseUtil;
> +import java.lang.reflect.Modifier;
>
> public class SerialVer extends Applet {
> GridBagLayout gb;
> @@ -211,7 +212,17 @@
> Class<?> cl = Class.forName(classname, false, loader);
> ObjectStreamClass desc = ObjectStreamClass.lookup(cl);
> if (desc != null) {
> - return " static final long serialVersionUID = " +
> + String ams = "";
> + try {
> + final int mod =
> + cl.getDeclaredField("serialVersionUID").getModifiers();
> + ams = Modifier.isPublic(mod) ? "public"
> + : Modifier.isProtected(mod) ? "protected"
> + : Modifier.isPrivate(mod) ? "private" : "";
> + } catch (NoSuchFieldException nsfe) {
> + ams = "private";
> + }
> + return " " + ams + " static final long serialVersionUID = " +
> desc.getSerialVersionUID() + "L;";
> } else {
> return null;
>
More information about the core-libs-dev
mailing list