java - 反序列化通用(但可序列化)类型

标签 java generics serialization

我想知道是否可以将通用类型反序列化为该类型的实例。如果可能的话,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/

相关文章:

c# - Tuple.Create 返回类型

c# - 是否可以强制类型参数在类上可以为空

java - 我可以使用 FileChooser (javafx) 将序列化对象保存在文件中吗?

c# - 子属性中的 DataContract 父引用 - 如何避免无限序列化循环

java - 无法将 SessionVariable 传递给其他流 Mule

java - 通用接口(interface)有好处吗?

java - 单击该 fragment 内的按钮关闭 fragment

c# - mscorlib.XmlSerializers.DLL 的 FileNotFoundException,它不存在

java - 如何在 Kotlin 中添加 UTF-8 BOM?

java - 使用 ViewModel 时导航不起作用