首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java枚举字段序列化/反序列化

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

Stack Overflow用户
提问于 2014-06-19 13:47:34
回答 1查看 1.4K关注 0票数 0

Intro

我在我的Java项目中使用阿帕奇风暴 (本地模式,而不是远程模式),在创建拓扑结构时,我需要将一个对象传递给其中一个

代码语言:javascript
复制
TopologyBuilder builder = new TopologyBuilder();
.....
builder.setBolt("last-bolt", new MyBolt(Classifier.SECONDS)).someGrouping(...);
.....
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test", conf, builder.createTopology());

对象本身有一些不可序列化的字段。我没有对这些字段所属的类进行子类分类,并使它们可序列化,而是采用了另一种方法。因为实际的对象不会发生很大的变化,而且可以枚举,所以我决定把它变成一个枚举,然后这样传递给螺栓的任务。枚举的好处是它在所有成本下都是可序列化的。这种方法可以在本地模式下工作,因为(如果我正确理解Storm ),我的计算机上只有一个JVM运行,实际上事情不可能变得复杂。

问题

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

实际的枚举(静态最终字段在末尾)

代码语言:javascript
复制
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包。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-19 14:59:41

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

所以答案是肯定的,这个场应该被正确地构造。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24308194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档