Java中的可序列化-JGraphT的Pair类-实例成员的类型也应实现可序列化吗?

时间:2019-05-05 11:33:20

标签: java serializable jgrapht

here中,JGraphT的Pair类为Serializable。但是此类中包含的实例成员(firstsecond)不会被强制为Serializable

这是当前实现的样子:

public class Pair<A, B>
    implements
    Serializable

我认为应该是这样的

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

我想念什么吗?如果不是,那么JGraphT为什么不做呢?

3 个答案:

答案 0 :(得分:4)

因为Serializable仅在运行时相关。

如果要使用具有不可序列化元素的对,它将起作用,但如果尝试序列化将失败。但是,如果两个元素均为Serializable,则它们将序列化,而与通用范围无关。

  • Pair<A extends Serializable, B extends Serializable> implements Serializable =>始终可序列化,但不能用于不可序列化的A / B
  • Pair<A, B> implements Serializable =>如果在运行时AB恰好是Serializable,则可序列化,但不能保证任何给定的Pair
  • Pair<A, B> / Pair<A extends Serializable, B extends Serializable> =>永远不会可序列化,而与类型参数无关,因为容器本身不是Serializable

答案 1 :(得分:0)

这确实取决于Serializable的用法。如果在框架内部使用它来序列化Pair并导致崩溃,那么您是对的。

如果这不是绝对要求,并且仅对实现者可序列化,则他们有责任确保实现。

例如,java.util.ArrayList还实现了Serializable,尽管它并不要求其成员可序列化。否则,ArrayList的序列化将失败。

答案 2 :(得分:-1)

如果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)