1

我正在尝试反序列化一些在序列化 Java HashSet 时在由 SnakeYaml 创建的字符串中设置的 YAML。不同的泛型类型被序列化,例如 HashSet 和自定义类型 HashSet。

示例 YAML:

holidays: !!set
    ? DDMMYYYY: 25/12/2042
      MMDDYYYY: 12/25/2042
      date:
        chronology: &id001
          calendarType: iso8601
          id: ISO
        dayOfMonth: 25
        dayOfWeek: THURSDAY
        dayOfYear: 359
        era: CE
        leapYear: false
        month: DECEMBER
        monthValue: 12
        year: 2042
      serialValue: 52225
    : null

我最初得到异常:

附加信息:无法加载文件或程序集“2002:set”或其依赖项之一。该系统找不到指定的文件。

为了解决这个问题,我将标签映射注册到反序列化器:

{"tag:yaml.org,2002:set", typeof (HashSet<object>)}

然后我得到异常:

YamlDotNet.dll 中出现“YamlDotNet.Core.YamlException”类型的第一次机会异常附加信息:(行:4,列:23,idx:108)-(行:5,列:9,idx:122):预期'SequenceStart',得到'MappingStart'(第 4 行,第 23 列,第 108 行)。

我原以为处理集是 YAML 的一个非常常见的要求,但我不知道如何解决这个问题。

任何人都可以建议如何处理?

4

1 回答 1

1

问题是它HashSet<T>没有实现IDictionary<TKey, TValue>,然后被反序列化为序列而不是映射。

您将需要创建自己的集合实现,可能通过像这样扩展HashSet<T>和实现IDictionary<T, object>

public class YamlSet<T> : HashSet<T>, IDictionary<T, object>
{
    void IDictionary<T, object>.Add(T key, object value)
    {
        Add(key);
    }

    object IDictionary<T, object>.this[T key]
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            Add(key);
        }
    }
    // ...
}

您将必须实现更多成员IDictionary<T, object>,但这些是使反序列化工作所必需的。

在此处查看完整的示例

于 2015-09-25T10:49:37.537 回答