【问题标题】:Serialization of set集合的序列化
【发布时间】:2023-03-03 22:40:01
【问题描述】:

我正在尝试编写自己的Set 序列化程序,特别是HashSet。这是因为这样一个包含枚举元素的集合的默认输出如下所示:

modifier: {
    amount: 1
    criteriaSet: {
        class: java.util.HashSet //<--- bothers me
        items: [
            NONE                
            ADD
            MULTIPLY
        ]
    }
}

所以我想我编写自己的序列化程序。这就是 write 方法的样子。

@Override
public void write(Json json, HashSet object, Class knownType) {
    json.writeObjectStart();
    for (Object o : object)
    {
        if (o instanceof Modifier.Criteria)
            json.writeValue("name", ((Modifier.Criteria) o).name());
    }
    json.writeObjectEnd();
}

这可行,但需要我为字段命名,因此输出如下:

modifier: {
    amount: 1
    criteriaSet: {
        name: NONE
        name: ADD
        name: MULTIPLY
    }
}

这可行,但由于默认的Set 序列化程序不写入字段名称(名称:)我也想要。只写枚举名称就会产生错误json.writeValue(((Modifier.Criteria) o).name()); : java.lang.IllegalStateException: Name must be set.

我首先为EnumSet 尝试了这个,因为EnumSetEnum 的集合更有效,但我也遇到了问题。我正在寻找一种干净的解决方案来将 Enum 值存储到 Set 中。

【问题讨论】:

    标签: java json serialization


    【解决方案1】:

    我猜你的意思是你希望它是一个 json 数组 ([..]) 而不是 json 对象 ({...})。在这种情况下使用writeArrayStart()writeArrayEnd()。另见:https://github.com/libgdx/libgdx/wiki/Reading-and-writing-JSON

    【讨论】:

    • 很好用。但是现在我在反序列化它时遇到了问题。有趣的是,我重写的读取方法甚至没有被调用。知道这是为什么吗?
    • 我认为这是因为 json 看到的是一个数组列表,但该字段是一个 HashSet。但是 read 方法不应该先运行并返回正确的类型吗? Caused by: java.lang.IllegalArgumentException: Can not set java.util.Set field com.buckriderstudio.towercrawler.Creature.Modifier.criteriaSet to java.util.ArrayList
    • 哪种读取方法?如果您还有其他问题,则可以提出其他问题,包括相关详细信息。
    • 是的,我应该。无论如何,正在谈论由序列化程序接口实现的读取方法。你需要一个 write 和一个 read 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2019-01-29
    相关资源
    最近更新 更多