在Java中,有没有一种方法可以使用除jdk序列化之外的类信息进行序列化?

时间:2016-01-18 09:46:14

标签: java serialization

我的系统中存在很多Callback个对象。 Callback定义如下:

public interface Callback {
    void callback() throws Exception;
}

Callback cb = new Callback() {
    public void callback() {
        System.out.println("I'm here!");
    }
}

现在,我需要将这些Callback对象序列化为字节,以便它们可以存储在redis服务器中,稍后再回来运行callback()方法。

显然,像杰克逊这样的Java常用序列化库在这里不起作用。为了运行callback()代码,序列化字节必须包含类信息。 JDK序列化是一个选项:

public interface Callback extends java.io.Serializable {
    void callback() throws Exception;
}

Callback cb = new Callback() {
    private static final long serialVersionUID = 1L;
    public void callback() {
        System.out.println("I'm here!");
    }
}

但是,通过这种方式,Callback的所有子类以及callback()方法引用的类都需要实现java.io.Serializable接口,这很难控制。

所以,我想知道是否有另一种序列化方式不需要所有类型的限制?

1 个答案:

答案 0 :(得分:5)

Java序列化不会存储比Jackson更多的信息。 (除了Java序列化支持图形和Jackson支持树之外)都不存储带有序列化数据的代码。

通常尝试使用数据存储代码是个坏主意。代码可以是;

  • 详细(使用多KB或MB)
  • 很难准确确定序列化的数量。
  • 与未来版本的代码不兼容。
  • 很难有效地加载。例如序列化100万个对象,当你加载它们时,你不想要100万个同一个类的副本。

您应该确保您可能要序列化的所有内容都在数据中,而不是代码中。

  

序列化字节必须包含类信息

这不是序列化的工作原理。通常假设所需的所有类都可用于反序列化数据的过程。

  

Callback的所有子类以及callback()

引用的类

当父级是Serializable时,它的所有子类也都是Serializable。