java - @SuppressWarnings ("serial")

标签 java serialization suppress-warnings

我有一个问题,因为我有点困惑(或者我没有注意到一些明显的事情)。假设我有一些包含很多类的源代码,这些类包含大量像这样定义的静态字段:

public final class ConverterTYPE  {
    private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>() {
        {
            put("A", new Byte((byte)12));
            put("B", new Byte((byte)13));
        }
    };

}

众所周知,静态字段不会被序列化。

但是,Java(和 Eclipse)提示“可序列化类没有声明 long 类型的静态最终 serialVersionUID 字段”。为什么他们不能注意到 static 不会被序列化?

下一个问题:使用 @SuppressWarnings("serial") 是否是解决此问题的正确方法?摆脱所有此类警告?

编辑:

我的类都没有实现 Serializable 接口(interface)(或者它们的父类(super class)都没有)。 Eclipse 指向 HashMap<String, Byte>及其警告。为什么它检测不到它是静态字段?

最佳答案

仅仅因为该字段可能不会被序列化并不意味着它引用的东西本身永远不会被序列化!其他人/事物可以获得对该映射的引用并尝试直接对其进行序列化,或者将其用作可序列化类中的实例成员等。我看到它是私有(private)的,但要确保它永远不会在当前类之外访问或设置为实例成员超出了编译器的范围(并且无论如何都不可能进行反射)。

一个可能的解决方案是简单地避免带有初始化器样式的匿名子类并执行此操作:

private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>();

static {  
  STRING_MAP.put("A", new Byte((byte)12));
  STRING_MAP.put("B", new Byte((byte)13));
}

在大多数情况下,结果几乎相同,并且您的代码中没有充斥着匿名类。

关于java - @SuppressWarnings ("serial"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4749207/

相关文章:

java - Hibernate 传递集合映射

Java数组反射: isArray vs. instanceof

java - 不一致的工作滚动条

objective-c - 抑制 "Method definition for %@ not found"

java - 不必要的@SuppressWarnings ("unused")

java - 临时将自签名证书添加到本地信任库

mysql - 无法使用 JSON 解析 MySql 时间戳

jquery - 无法序列化对象 - jquery.param 返回未定义

java - 在 Java 中使用随机访问文件更新文件的一部分

python - 忽略消息包含特定字符串的警告