YamlDotNet:如何处理!!设置

时间:2015-09-24 08:47:04

标签: java c# serialization snakeyaml yamldotnet

我正在尝试反序列化在序列化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'或其中一个依赖项。系统找不到指定的文件。

要修复,我将标记映射注册到Deserializer:

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

然后我得到例外:

  

类型&#39; YamlDotNet.Core.YamlException&#39;的第一次机会异常发生在YamlDotNet.dll中   附加信息:(行:4,Col:23,Idx:108) - (行:5,Col:9,Idx:122):预期&#39; SequenceStart&#39;,得到&#39; MappingStart&#39; (在线:4,Col:23,Idx:108)。

我原本以为处理集是YAML的一个非常常见的要求,但我无法弄清楚如何解决这个问题。

有人可以建议如何处理吗?

1 个答案:

答案 0 :(得分: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>的更多成员,但这些是使反序列化工作所必需的成员。

See a fully working example here