我想知道是否可以将通用类型反序列化为该类型的实例。如果可能的话,Java 是否考虑了泛型类型的自定义反序列化(如果有)?
在我的例子中,我正在尝试实现一个由包含元素序列化形式的文件支持的列表,并且需要从 byte[] 实例化一个通用类型,例如:
class FileBackedList<V extends Serializable> implements List<V> {
// ...
public V get(int index) {
byte[] value = readFromFile(index);
// ???????
// I'm pretty certain this doesn't work
return (V)(new ObjectInputStream(new ByteArrayInputStream(value)).readObject());
}
private byte[] readFromFile(int index) {
// read bytes at line 'index'
}
}
这种类型的东西有什么办法可以工作吗?
编辑:如果它确实有效,我是否肯定会为类型 V 调用正确的 readObject(ObjectInputStream in)(如果它有自定义类型)?
顺便说一句,我不想序列化整个列表。
最佳答案
为什么那行不通(原则上)?我没有测试过你的代码,但是当你使用它时很 FileBackedList<V>
将您的对象序列化到文件中,然后您可以再次正确反序列化它们并使用不安全类型转换返回它们 return (V) ...
.原因如下:
- 即使 V 被编译器翻译成 Serializable,你的具体对象对 JVM 来说也是已知的,例如字符串、整数或任何其他可序列化的对象。因此,当您在 ObjectOutputStream 上序列化它们时,将存储具体类型。
- 当您再次从 ObjectInputStream 加载对象时,您将获得具有正确类型(例如 String、Integer 或其他)的相同对象。这实际上与 V 相同
因为您向外界隐藏了列表的实现,所以不安全的类型转换将起作用。示例:
FileBackedList<String> list = new FileBackedList<String>();
// This will probably serialise the String "abc" to your file
list.add("abc");
// This will not work. <V> is always String for FileBackedList<String>
list.add(Integer.valueOf(1));
// This will be type-safe. It can only be String because you bind V to String
String abc = list.get(0);
所以继续做吧! :-)
关于java - 反序列化通用(但可序列化)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3970646/