如何在java中序列化Multipart File类

Era*_*ara 4 java serialization spring file-upload sonarqube

任何人都知道如何序列化org.springframework.web.multipart.MultipartFile

在声纳库中,它被视为一个关键问题。

在此输入图像描述

rzw*_*oot 5

这些声纳规则试图告诉您潜在的编程问题。

如果您不打算尝试找出问题所在,则应该完全禁用 sonarqube。从您的问题来看,尚不清楚您是否真的想要序列化包含此字段的类,或者您只是想解决此错误显示的问题,或者您只是想删除该消息而不关心该消息它试图告知您潜在的问题。

我想删除该消息

简单的!只需卸载 sonarqube 即可。比随机输入您不理解的关键字要好得多。

我想了解根本问题

Java内置了所谓的序列化机制。序列化是获取一个对象并将其转换为字节流的想法,以便您可以将其存储在文件中、通过网络发送等等。

问题是,MultipartFile 并不是为序列化而设计的。然而,这个类private MultipartFile file;说它可以序列化,这就是问题:它这么说。但这不是真的。

最有可能的是,您犯的错误(如果我们可以这样称呼它,那么这并不是一个太大的错误)是您错误地将包含此字段的类标记为可序列化。你真的连载这个东西吗?我假设你不是。

那么,您真的打算序列化这个对象吗?我假设你不知道。除非您明确调用例如.writeObject(someInstanceOfThisclass)anObjectOutputStream或类似的内容,否则您不会序列化它。

你无意连载此内容

序列化机制的一个缺点是,一旦超类型决定您是可序列化的(通过实现接口来完成java.io.Serializable),那么您就是可序列化的,并且您不能再标记:实际上,不,我不是。因此,要正确消除此警告,就要确保您的超类型没有“扩展可序列化”。如果你能做到,那就这么做吧。例如,如果您决定这样做extends HashMap,请不要这样做 - 相反,implements Map创建一个 HashMap 类型的字段,并对 Map 中仅调用您的 hashmap 字段的所有方法进行单行实现。

但是,如果您正在实现/扩展的类型本身实现了可序列化,并且无法从您的超类型中删除,那么还有另一种选择。为此,请添加以下方法:

private void writeObject(ObjectOutputStream out) throws IOException {
    throw new IOException("Not serializable");
}

private void readObject(ObjectInputStream in) throws IOException {
    throw new IOException("Not serializable");
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,从代码中可以清楚地看出,您明确希望此类不可序列化,并且sonarqube 也会弄清楚这一点:当您执行此操作时,sonarqube 问题将消失

其实我确实想连载这个

啊。这是一个更大的问题,因为 MultipartFile 不允许你这样做。您唯一的解决方案是完全摆脱 multipartfile 字段并将其替换为可序列化的内容(例如字符串列表、字节数组等),或者编写自己的代码来生成字节序列,以便您可以稍后从该字节序列恢复此 MultipartFile。这可能意味着您需要存储所有这些字节,这可能会很痛苦 - 可能会很多。

为此,请重写这些相同的方法,但实际实现一些内容而不是抛出该异常。编写自己的 writeObject 方法有点复杂,但是您可以通过搜索网络找到大量示例。

如果您实际上并不关心此字段,那么大概只需..删除该字段。为什么有它?

您可以将该字段标记为transient。但是,这意味着如果该对象被序列化然后反序列化,它将是null. 让自己被连载有什么意义呢?transient主要用于表示缓存数据的字段,这些字段只能通过在字段未初始化时仅(重新)计算的方法访问。一个简单的例子是,如果您的hashCode()方法是一个潜在昂贵的操作。