繁体   English   中英

如何使通用类型 class 可序列化?

[英]How to make a generic typed class serializable?

用例如下,我有一个通用的 class 如下:

public class Test<T> implements Serializable {
private T testObject;
 .....
} 

随着 sonarLint 关闭,抱怨字段 testObject 应该是瞬态的或可序列化的。

如果我按如下方式进行所需/建议的更改:

public class Test<T extends Serializable> implements Serializable {
    private T testObject;
     .....
    } 

虽然如果我想使用这个通用测试 class,那么我不能将它与接口类型一起使用,例如 List 接口,因为 List 当然不是可序列化的。

这不会编译,但在我看来是针对接口编程的首选方式。

public Test<List<String>> doSomething() {
}

这编译,但实际上不是我想要的......

public Test<ArrayList<String>> doSomething() {
}

所以,不确定我的问题的答案是什么......我应该忽略 SonarLint 警告还是有不同的方法来解决/绕过这个?

包含对不可序列化 object 的引用的 object 无法通过默认序列化算法进行序列化。 对于您的特定情况,没有类型安全的方式来进行自定义序列化。 因此,您只有三个主要选择:

  1. 不要修改您的原始代码,并在它声明自己Serializable时接受它的谎言 如果 class 可Serializable对您来说真的很重要——也就是说,您计划序列化实例——那么这会产生不可忽略的故障风险,但如果在实践中, testObject成员始终是可序列化的。 这实际上是java.util.ArrayList和其他一些可序列化的标准库类所采用的策略。

  2. 不要让您的 class 可Serializable 然后眼前的问题就消失了,但当然,实例更不是默认可序列化的。 这可能对你不起作用。

  3. 使用T extends Serializable (或extends其他一些可序列化类型)实现您描述的建议更改。 这是类型安全的替代方案。 它避免了序列化失败的风险,因为这在您的类的控制范围内。 成本如您所描述 - type 参数将排除不可序列化的类型。 对于List的特定情况,您可以改为使用可序列化的List实现之一来代替List接口,但您必须确定它在技术上和风格上对您的效果如何。

我们无法告诉您其中哪一个最适合您的特定目的。 你必须自己决定。

不!

为什么要在 2022 年实现 Serializable?

如果你只是不实现 Serializable 你的问题就解决了。 序列化可能会给您带来更多的问题而不是好处。 如果一个框架迫使你去实现它,那就离开那个框架,因为生命很短,无法在 2022 年使用序列化来创造新的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM