It looks to me like Collections.reverseOrder no longer deserializes to the
same object.  It also looks like the definition for that in
Collections.java hasn't changed recently.  So I suspect that there has been
some serious incompatible change to deserialization itself.
(It's another matter whether that could break TreeSet).
(I have long lobbied for more cross-jdk testing focused on seriallization)

The program below demonstrates the different behavior between jdk7 and jdk8:

import java.util.*;
import java.io.*;

public class ReverseOrder {
    public static void main(String[] args) throws Throwable {
        Comparator c = Collections.reverseOrder();
        if (c != serialClone(c))
            throw new Error(String.format("c=%s clone=%s",
                                          c, serialClone(c)));
    }

    static byte[] serialBytes(Object o) {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(o);
            oos.flush();
            oos.close();
            return bos.toByteArray();
        } catch (Throwable t) {
            throw new Error(t);
        }
    }

    @SuppressWarnings("unchecked")
    static <T> T serialClone(T o) {
        try {
            ObjectInputStream ois = new ObjectInputStream
                (new ByteArrayInputStream(serialBytes(o)));
            T clone = (T) ois.readObject();
            return clone;
        } catch (Throwable t) {
            throw new Error(t);
        }
    }
}


On Fri, Feb 8, 2013 at 3:16 PM, Mike Duigou <mike.dui...@oracle.com> wrote:

> Thank you for catching this Doug. I missed your original post on this
> topic during my Christmas vacation. (
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-December/013127.htmlfor
>  those following along at home)
>
> I will definitely hold off and follow up on the potentially bad patch to
> Java 8. I have created an issue to resolve the test breakage, JDK-8007889
>
> Mike
>
> On Feb 8 2013, at 11:43 , Doug Lea wrote:
>
> > On 02/08/13 14:33, Mike Duigou wrote:
> >> Hello all;
> >>
> >> I would like to backport this change from Java 8. It has been baking in
> JDK8 for about two months with no problems.
> >>
> >
> > I think it may have problems.
> > As I mentioned in a post a few months ago, it seems
> > to be responsible for breakage in a TCK/JCK test;
> > One derived from a jsr166 tck test at
> >
> http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/test/tck/TreeSubSetTest.java?view=log
> >
> > You need the file for context, but it looks like:
> >
> >    public void testDescendingSerialization() throws Exception {
> >        NavigableSet x = dset5();
> >        NavigableSet y = serialClone(x);
> >
> >        assertTrue(x != y);
> >        assertEquals(x.size(), y.size());
> >        assertEquals(x.toString(), y.toString());
> >        assertEquals(x, y);
> >        assertEquals(y, x);
> >        while (!x.isEmpty()) {
> >            assertFalse(y.isEmpty());
> >            assertEquals(x.pollFirst(), y.pollFirst());
> >        }
> >        assertTrue(y.isEmpty());
> >    }
> >
> >
> >> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7175464
> >>
> >> http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/bf6ceb6b8f80
> >>
> >> The change was previously reviewed by Alan Bateman, Paul Sandoz and
> David Holmes before going in to Java 8.
> >>
> >> Mike
> >>
> >
>
>

Reply via email to