有人知道怎么连载吗 org.springframework.web.multipart.MultipartFile 班在某些情况下,它的表现可能是一个关键问题。
org.springframework.web.multipart.MultipartFile
wfsdck301#
那些sonarqube规则试图告诉你一个潜在的编程问题。如果你不想弄清楚问题出在哪里,你应该完全停止。从您的问题来看,不清楚您是真的要序列化包含此字段的类,还是只想修复此错误显示的问题,还是只想删除消息而不关心它试图通知您的基本问题。
容易的!只要卸载sonarqube。比随意输入你不懂的关键词要好得多。
java内置了所谓的序列化机制。序列化就是把一个对象转换成一个字节流,这样你就可以把它存储在一个文件中,通过网络发送,等等。问题是,multipartfile不是被设计成序列化的。然而,这个班 private MultipartFile file; 字段在中,表示它可以序列化,这就是问题所在:它表示可以序列化。但这不是真的。很可能,您犯的错误(如果我们可以这样称呼它,那也算不上什么错误)是您错误地将包含此字段的类标记为serializable。你真的序列化了吗?我想你不是。那么,你真的打算序列化这个对象吗?我想你不会的。除非你明确地打电话。 .writeObject(someInstanceOfThisclass) 在 ObjectOutputStream 或者类似的,你没有序列化这个。
private MultipartFile file;
.writeObject(someInstanceOfThisclass)
ObjectOutputStream
序列化机制的一个缺点是,一旦超类型决定您是可序列化的(由实现完成) java.io.Serializable 接口),那么你就是这样,你不能记下来:实际上,不,我不是。所以,要正确地消除这个警告,就是要确保您的“extends serializable”没有父类型。如果你能做到,就这么做。例如,如果你决定 extends HashMap ,不要那样做-相反, implements Map ,创建一个hashmap类型的字段,并为map中所有只调用hashmap字段的方法创建一个线性实现。但是,如果您正在实现/扩展的类型本身实现了serializable,但无法从您的超类型中删除,那么还有一种替代方法。为此,请添加以下方法:
java.io.Serializable
extends HashMap
implements Map
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() 方法是一个潜在的昂贵操作。
transient
null
hashCode()
1条答案
按热度按时间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,但无法从您的超类型中删除,那么还有一种替代方法。为此,请添加以下方法:
通过这样做,从代码中可以清楚地看到,您明确希望这个类不可序列化,sonarqube也会发现:当您这样做时,sonarqube问题将消失。
实际上我确实想序列化这个
啊。这是一个更大的问题,因为multipartfile不允许您这样做。唯一的解决方案是完全删除multipartfile字段,并用可序列化的内容(如字符串列表、字节数组等)替换它,或者编写自己的代码生成一个字节序列,以便以后可以从该字节序列还原此multipartfile。这可能意味着您需要存储所有这些字节,这可能会很痛苦—可能会有很多字节。
为此,重写那些相同的方法,但实际上实现一些东西,而不是抛出那个异常。编写自己的writeobject方法有点复杂,但是通过搜索web可以找到大量的示例。
如果你真的不关心这个领域,那么大概,只是。。删除字段。为什么有它?
你可以把这块地标记为
transient
. 但是,这意味着,如果将此对象序列化然后反序列化,它将null
. 允许自己被序列化有什么意义?transient
主要用于表示缓存数据的字段,只有在字段未初始化时才(重新)计算的方法才能访问这些字段。一个微不足道的例子是hashCode()
方法是一个潜在的昂贵操作。