繁体   English   中英

Java枚举字段序列化/反序列化

[英]Java enum fields serialization/deserialization

介绍

我在Java项目中使用Apache Storm (本地模式,而不是远程模式),并且在创建拓扑时需要将对象传递给其中一个螺栓

TopologyBuilder builder = new TopologyBuilder();
.....
builder.setBolt("last-bolt", new MyBolt(Classifier.SECONDS)).someGrouping(...);
.....
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test", conf, builder.createTopology());

对象本身具有一些不可序列化的字段。 除了采用这些字段所属的类的子类并使其可序列化之外,我采用了另一种方法。 由于实际的对象不会发生太大变化,并且可以枚举,因此我决定将其作为枚举并将其传递给bolt的任务。 枚举的好处是,它在所有成本下都是可序列化的。 这种方法在本地模式下有效,因为(如果我正确理解了Storm的话)我的计算机上只有一个JVM运行,并且实际上不会变得复杂。

如果枚举由一个静态的最终不可序列化字段组成,那么当该枚举被另一台计算机或运行多个JVM的集群上的另一个进程反序列化时,该字段是否可以正确构造?

实际的枚举静态final字段位于末尾

public enum Classifier {
    SECONDS {            
        public String classify(String timestamp) {
            DateTime dateTime = formatter.parseDateTime(timestamp);
            int second = dateTime.getSecondOfMinute();
            if (second <= 30) {
                return "00 - 30";
            } else {
                return "30 - 60";
            }
        }


        public int getNumberOfCategories() {
            return 2;
        }
    },

    WEEK {            
        public String classify(String timestamp) {
            DateTime dateTime = formatter.parseDateTime(timestamp);
            int dayOfWeek = dateTime.getDayOfWeek();
            String typeOfDay = (dayOfWeek >= 1 && dayOfWeek <= 5) ? "workday" : "weekend";
            int hour = dateTime.getHourOfDay();
            String hourInterval = hour + " - " + (hour == 23 ? 0 : hour + 1);
            return typeOfDay + " " + hourInterval;
        }


        public int getNumberOfCategories() {
            return 48;
        }
    };

    private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");

    public abstract String classify(String timestamp);

    public abstract int getNumberOfCategories();
}

更多细节

DateTimeFormatter和DateTime来自org.joda.time包。

加载类时,将初始化所有static final字段。 无论使用哪种序列化机制,它都将首先初始化静态字段并执行静态初始化块。 请注意,不对静态字段进行反序列化,因为我们不是对类而是对对象进行反序列化(也请参考此答案https://stackoverflow.com/a/6429497/1937263 )。

因此答案是肯定的,该字段应正确构建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM