Сериализуемый в Java - класс Pair JGraphT - должен ли тип членов экземпляра также реализовывать Serializable? - PullRequest
1 голос
/ 05 мая 2019

С здесь , класс JGraphT Pair равен Serializable.Но члены экземпляра, которые этот класс содержит (first и second), не обязательно должны быть Serializable.

. Вот как выглядит текущая реализация:

public class Pair<A, B>
    implements
    Serializable

Iдумаю, это должно быть что-то вроде:

public class Pair<A extends Serializable, B extends Serializable>
    implements
    Serializable

Я что-то упустил?Если нет, то почему это не сделано JGraphT?

Ответы [ 3 ]

4 голосов
/ 05 мая 2019

Поскольку Serializable имеет значение только во время выполнения.

Если вы хотите использовать пару с несериализуемыми элементами, она будет работать, за исключением того, что при попытке сериализации произойдет сбой.Однако, если оба элемента Serializable, они будут сериализованы независимо от общих границ.

  • Pair<A extends Serializable, B extends Serializable> implements Serializable => Всегда сериализуемы, но не могут использоваться для несериализуемых A / B
  • Pair<A, B> implements Serializable => Сериализуемый, если A и B оказываются Serializable во время выполнения, но нет никаких гарантий для любого данного Pair.
  • Pair<A, B> /Pair<A extends Serializable, B extends Serializable> => Никогда не будет сериализуемым независимо от параметров типа, поскольку сам контейнер не является Serializable.
0 голосов
/ 05 мая 2019

Это зависит от использования Serializable.Если это используется внутри Framework для сериализации Pair и аварийного завершения в противном случае, тогда вы правы.

Если это не абсолютное требование и оно только для Serializeable для разработчиков, это их ответственность:убедитесь, что.

Например, java.util.ArrayList также реализует Serializable, хотя и не требует, чтобы его члены были сериализуемыми.Сериализация ArrayList потерпит неудачу, если это не так.

0 голосов
/ 05 мая 2019

Если A & B будут полями вашего класса, то они должны быть.

пример ArrayList и не сериализуемого содержимого:

TestClass:

public class NonSerialClass {

    private int i;

    public NonSerialClass(int i) {
        this.i = i;
    }

    @Override
    public String toString() {
        return "NonSerialClass{" +
                "i=" + i +
                '}';
    }
}

Класс бегуна:


        List<NonSerialClass> nonSerialClasses= new ArrayList<>();

        nonSerialClasses.add(new NonSerialClass(1));

        nonSerialClasses.add(new NonSerialClass(2));

        System.out.println("Before "+nonSerialClasses);


        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);

        oos.writeObject(nonSerialClasses);
        oos.flush();
        oos.close();


        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream oin = new ObjectInputStream(byteArrayInputStream);
        List ts = (List) oin.readObject();
        System.out.println("After "+ts);

И результат будет:

Before [NonSerialClass{i=1}, NonSerialClass{i=2}]
Exception in thread "main" java.io.NotSerializableException: ru.NonSerialClass
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.ArrayList.writeObject(ArrayList.java:766)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
...