spring—如何在java中序列化多部分文件类

gfttwv5a  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(305)

有人知道怎么连载吗 org.springframework.web.multipart.MultipartFile
在某些情况下,它的表现可能是一个关键问题。

wfsdck30

wfsdck301#

那些sonarqube规则试图告诉你一个潜在的编程问题。
如果你不想弄清楚问题出在哪里,你应该完全停止。从您的问题来看,不清楚您是真的要序列化包含此字段的类,还是只想修复此错误显示的问题,还是只想删除消息而不关心它试图通知您的基本问题。

我只想把这条信息处理掉

容易的!只要卸载sonarqube。比随意输入你不懂的关键词要好得多。

我想知道潜在的问题

java内置了所谓的序列化机制。序列化就是把一个对象转换成一个字节流,这样你就可以把它存储在一个文件中,通过网络发送,等等。
问题是,multipartfile不是被设计成序列化的。然而,这个班 private MultipartFile file; 字段在中,表示它可以序列化,这就是问题所在:它表示可以序列化。但这不是真的。
很可能,您犯的错误(如果我们可以这样称呼它,那也算不上什么错误)是您错误地将包含此字段的类标记为serializable。你真的序列化了吗?我想你不是。
那么,你真的打算序列化这个对象吗?我想你不会的。除非你明确地打电话。 .writeObject(someInstanceOfThisclass)ObjectOutputStream 或者类似的,你没有序列化这个。

你不打算序列化这个

序列化机制的一个缺点是,一旦超类型决定您是可序列化的(由实现完成) java.io.Serializable 接口),那么你就是这样,你不能记下来:实际上,不,我不是。所以,要正确地消除这个警告,就是要确保您的“extends serializable”没有父类型。如果你能做到,就这么做。例如,如果你决定 extends HashMap ,不要那样做-相反, implements Map ,创建一个hashmap类型的字段,并为map中所有只调用hashmap字段的方法创建一个线性实现。
但是,如果您正在实现/扩展的类型本身实现了serializable,但无法从您的超类型中删除,那么还有一种替代方法。为此,请添加以下方法:

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

private void readObject(ObjectInputStream in) throws IOException {
    throw new IOException("Not serializable");
}

通过这样做,从代码中可以清楚地看到,您明确希望这个类不可序列化,sonarqube也会发现:当您这样做时,sonarqube问题将消失。

实际上我确实想序列化这个

啊。这是一个更大的问题,因为multipartfile不允许您这样做。唯一的解决方案是完全删除multipartfile字段,并用可序列化的内容(如字符串列表、字节数组等)替换它,或者编写自己的代码生成一个字节序列,以便以后可以从该字节序列还原此multipartfile。这可能意味着您需要存储所有这些字节,这可能会很痛苦—可能会有很多字节。
为此,重写那些相同的方法,但实际上实现一些东西,而不是抛出那个异常。编写自己的writeobject方法有点复杂,但是通过搜索web可以找到大量的示例。
如果你真的不关心这个领域,那么大概,只是。。删除字段。为什么有它?
你可以把这块地标记为 transient . 但是,这意味着,如果将此对象序列化然后反序列化,它将 null . 允许自己被序列化有什么意义? transient 主要用于表示缓存数据的字段,只有在字段未初始化时才(重新)计算的方法才能访问这些字段。一个微不足道的例子是 hashCode() 方法是一个潜在的昂贵操作。

相关问题