【问题标题】:How to make a generic typed class serializable?如何使泛型类型的类可序列化?
【发布时间】:2022-09-23 20:45:29
【问题描述】:

用例如下,我有一个通用类如下:

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

使用 sonarLint 抱怨字段 testObject 应该是瞬态的或可序列化的。

如果我要进行如下要求/建议的更改:

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

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

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

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

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

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

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

  • \"ArrayList&lt;List&lt;String&gt;&gt; doSomething()\" 这和你的Test 班级有什么关系?你的意思是Test&lt;ArrayList&lt;String&gt;&gt;
  • \“有没有不同的方法来解决/绕过这个?\”这在很大程度上取决于你想要做什么/\“通用程度”你真的需要它(比如,你需要它来处理任何 T ,或者是否有一些您需要的 Ts)。
  • 您可能应该找到一种不同的方法来解决您的序列化需求,但是如果您坚持使用 java 的序列化机制(它有各种各样的问题),那么接下来最好的事情就是充分理解它的许多细微差别。了解它们后,您还可以弄清楚该警告的含义,进行相应调整,然后然后忽略警告。
  • 关于 Sonar 的警告需要指出的一件事:我很确定它不会警告您 Test&lt;ArrayList&lt;NonSerializableThing&gt;&gt; 不可序列化 - 部分原因是,如果列表为空,它将是可序列化的或为空。因此,警告所传达的安全印象有点误导。

标签: java


【解决方案1】:

不!

为什么要在 2022 年实现 Serializable?

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 2020-10-08
      • 2011-07-29
      • 1970-01-01
      • 2017-04-18
      • 2014-12-20
      • 2018-04-27
      • 2016-05-27
      相关资源
      最近更新 更多