在here中,JGraphT的Pair
类为Serializable
。但是此类中包含的实例成员(first
和second
)不会被强制为Serializable
。
这是当前实现的样子:
public class Pair<A, B>
implements
Serializable
我认为应该是这样的
public class Pair<A extends Serializable, B extends Serializable>
implements
Serializable
我想念什么吗?如果不是,那么JGraphT为什么不做呢?
答案 0 :(得分:4)
因为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
。答案 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)