如何在 java 中序列化多部分文件 class
How to serialized Multipart File class in java
任何人都知道如何序列化 org.springframework.web.multipart.MultipartFile
class
在 sonarqube 中,它显示为一个严重问题。
那些 sonarqube 规则试图告诉你一个潜在的编程问题。
如果您不打算找出问题所在,您应该完全禁用 sonarqube。从你的问题中不清楚你是否真的想序列化包含这个字段的 class ,或者你是否只是想解决这个错误显示的问题,或者你是否只是想摆脱消息不关心它试图通知您的潜在问题。
我只想删除邮件
简单!只需卸载sonarqube。比随意输入你不理解的关键字要好得多。
我想了解潜在的问题
Java 内置了所谓的序列化机制。序列化是获取对象并将其转换为字节流的想法,以便您可以将其存储在文件中、通过网络发送等等。
问题是,MultipartFile 不是为序列化而设计的。但是,这个 private MultipartFile file;
字段所在的 class 表示它可以序列化,这就是问题所在:它表示。但事实并非如此。
您所犯的错误(如果我们可以这样称呼它,那不是什么大错误)很可能是您错误地将包含此字段的 class 标记为可序列化。你真的连载这个东西吗?我假设你不是。
所以,你真的有意序列化这个对象吗?我假设你没有。除非你明确地打电话给例如.writeObject(someInstanceOfThisclass)
在 ObjectOutputStream
或类似的文章上,您没有序列化它。
你无意连载这个
序列化机制的一个缺点是,一旦超类型确定您是可序列化的(通过实现 java.io.Serializable
接口来完成),那么您就是可序列化的,并且您不能再标记:实际上,不,我不是。所以,要正确摆脱这个警告就是要确保没有你的超类型 'extends Serializable'。如果你能做到,那就去做吧。例如,如果您决定 extends HashMap
,请不要那样做 - 相反,implements Map
,创建一个 HashMap 类型的字段,并在 Map 中对仅调用您的方法的所有方法进行单行实现哈希映射字段。
但是,如果您 implementing/extending 本身实现了 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");
}
通过这样做,从代码中可以清楚地看出您明确打算让这个 class 不可序列化, 和 sonarqube 也会解决这个问题:sonarqube issue will disappear when you do this.
其实我很想连载这个
啊。这是一个更大的问题,因为 MultipartFile 不允许你这样做。您唯一的解决方案是完全摆脱 multipartfile 字段并将其替换为可序列化的内容(例如字符串列表、字节数组等),或者编写您自己的代码来生成字节序列,这样您就可以稍后从该字节序列恢复此 MultipartFile。这可能意味着您需要存储所有这些字节,这可能会很痛苦 - 可能有很多字节。
要做到这一点,重写那些相同的方法,但实际上实现一些东西而不是抛出那个异常。编写自己的 writeObject 方法有点复杂,但是您可以通过搜索网络找到大量示例。
如果您实际上并不关心这个字段,那么大概只是.. 删除该字段。为什么要有?
您可以将字段标记为 transient
。然而,这意味着如果这个对象被序列化然后反序列化,它将是null
。允许自己被连载有什么意义? transient
主要用于表示缓存数据的字段,如果字段未初始化,则只能通过将(重新)计算的方法访问这些数据。一个简单的例子是,如果您的 hashCode()
方法是一个潜在的昂贵操作。
使用您自己的 implementation/abstraction MultipartFile。这将解决关键的 SonarQube 问题:
public abstract class MyMultipartFile implements MultipartFile, Serializable{
private static final long serialVersionUID = 5XXXXXXXXXXXXXXXXXXL;
}
任何人都知道如何序列化 org.springframework.web.multipart.MultipartFile
class
在 sonarqube 中,它显示为一个严重问题。
那些 sonarqube 规则试图告诉你一个潜在的编程问题。
如果您不打算找出问题所在,您应该完全禁用 sonarqube。从你的问题中不清楚你是否真的想序列化包含这个字段的 class ,或者你是否只是想解决这个错误显示的问题,或者你是否只是想摆脱消息不关心它试图通知您的潜在问题。
我只想删除邮件
简单!只需卸载sonarqube。比随意输入你不理解的关键字要好得多。
我想了解潜在的问题
Java 内置了所谓的序列化机制。序列化是获取对象并将其转换为字节流的想法,以便您可以将其存储在文件中、通过网络发送等等。
问题是,MultipartFile 不是为序列化而设计的。但是,这个 private MultipartFile file;
字段所在的 class 表示它可以序列化,这就是问题所在:它表示。但事实并非如此。
您所犯的错误(如果我们可以这样称呼它,那不是什么大错误)很可能是您错误地将包含此字段的 class 标记为可序列化。你真的连载这个东西吗?我假设你不是。
所以,你真的有意序列化这个对象吗?我假设你没有。除非你明确地打电话给例如.writeObject(someInstanceOfThisclass)
在 ObjectOutputStream
或类似的文章上,您没有序列化它。
你无意连载这个
序列化机制的一个缺点是,一旦超类型确定您是可序列化的(通过实现 java.io.Serializable
接口来完成),那么您就是可序列化的,并且您不能再标记:实际上,不,我不是。所以,要正确摆脱这个警告就是要确保没有你的超类型 'extends Serializable'。如果你能做到,那就去做吧。例如,如果您决定 extends HashMap
,请不要那样做 - 相反,implements Map
,创建一个 HashMap 类型的字段,并在 Map 中对仅调用您的方法的所有方法进行单行实现哈希映射字段。
但是,如果您 implementing/extending 本身实现了 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");
}
通过这样做,从代码中可以清楚地看出您明确打算让这个 class 不可序列化, 和 sonarqube 也会解决这个问题:sonarqube issue will disappear when you do this.
其实我很想连载这个
啊。这是一个更大的问题,因为 MultipartFile 不允许你这样做。您唯一的解决方案是完全摆脱 multipartfile 字段并将其替换为可序列化的内容(例如字符串列表、字节数组等),或者编写您自己的代码来生成字节序列,这样您就可以稍后从该字节序列恢复此 MultipartFile。这可能意味着您需要存储所有这些字节,这可能会很痛苦 - 可能有很多字节。
要做到这一点,重写那些相同的方法,但实际上实现一些东西而不是抛出那个异常。编写自己的 writeObject 方法有点复杂,但是您可以通过搜索网络找到大量示例。
如果您实际上并不关心这个字段,那么大概只是.. 删除该字段。为什么要有?
您可以将字段标记为 transient
。然而,这意味着如果这个对象被序列化然后反序列化,它将是null
。允许自己被连载有什么意义? transient
主要用于表示缓存数据的字段,如果字段未初始化,则只能通过将(重新)计算的方法访问这些数据。一个简单的例子是,如果您的 hashCode()
方法是一个潜在的昂贵操作。
使用您自己的 implementation/abstraction MultipartFile。这将解决关键的 SonarQube 问题:
public abstract class MyMultipartFile implements MultipartFile, Serializable{
private static final long serialVersionUID = 5XXXXXXXXXXXXXXXXXXL;
}