当前位置: 首页 > 知识库问答 >
问题:

在Java,除了jdk序列化之外,有没有用类信息序列化的方法?

翟俊名
2023-03-14

我的系统中存在大量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,如jackson,在这里是行不通的。为了运行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个答案

解明辉
2023-03-14

Java序列化存储的信息并不比jackson多。(除了Java序列化支持图和jackson支持树)都没有用序列化的数据存储代码。

通常尝试将代码与数据一起存储是一个坏主意。代码可以是;

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

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

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

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

回调的所有子类以及从回调引用的类()

当父级是可序列化的时,它的所有子类也将是可序列化的。

 类似资料:
  • 我们希望序列化Java类的模式,以便任何字段或类上存在的所有注释也序列化到模式中。 我没有找到这样做的工具。 Avro不处理非字符串映射键,FasterXML不处理循环引用。它们都不会将注释序列化到模式中。 是否有任何Java JSON(反)序列化程序可以做到这一点?

  • 问题内容: 我有: 在MyClass2中是无法序列化的属性。如何序列化(和反序列化)此对象? 更正:MyClass2当然不是接口,而是类。 问题答案: 正如其他人指出的那样,Josh Bloch的Effective Java的 第11章是有关Java序列化的必不可少的资源。 该章中与您的问题有关的几点: 假设您要序列化MyClass2中不可序列化字段的状态,则MyClass必须可以直接访问该字段,

  • Json序列化和Jdk序列化在存储、效率上的对比? 在之前学习Redis时,我了解的是Json序列化比原生Jdk更高效,占用空间更小,所以无脑选择Json序列化。 但是最近我在看Pig开源框架中Oauth2的时候,发现存入Token令牌居然是用的Jdk序列化方式,我很疑惑,于是自己再用Json的方式去存,看看到底会有什么区别。 结果发现Json方式占用空间比Jdk的大了很多(Jdk为17)。 我又

  • 问题内容: 我正在处理,&,但出现此错误。 请在下面检查我的实体 我该如何解决? 问题答案: 通过hibernate代理对象进行延迟加载时,我遇到了类似的问题。通过用以下方式注释具有延迟加载的私有属性的类来解决此问题: 我假设您可以在代理对象上添加打破JSON序列化到该批注的属性。 问题在于实体是延迟加载的,序列化是在实体完全加载之前发生的。

  • 其中备注是对象内部的vavr列表字段。 现在,如果尝试将相同的值反序列化到对象中,则会出现错误: 当尝试反序列化时,为什么serified JSON文本不起作用? 在Java代码中有没有其他方法可以将vavr对象打印成文本格式并将其转换回POJO?

  • 问题内容: 有没有一种方法可以序列化angularjs的功能? 我的帖子现在看起来像这样。 问题答案: 这不是使用AngularJS访问表单数据的方式。表单中的数据应在范围内绑定。 因此,使用一个对象,例如$ scope.formData,它将包含您的所有数据结构,然后应使用ng-model将每个表单元素绑定到此对象。 例如: http://jsfiddle.net/rd13/AvGKj/13/