首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YamlDotNet:如何处理!!

YamlDotNet:如何处理!!
EN

Stack Overflow用户
提问于 2015-09-24 08:47:03
回答 1查看 1.3K关注 0票数 1

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

例YAML:

代码语言:javascript
复制
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”或其依赖项之一。系统找不到指定的文件。

要修复,我将标记映射注册到反序列化器:

代码语言:javascript
复制
{"tag:yaml.org,2002:set", typeof (HashSet<object>)}

然后我得到了例外:

在YamlDotNet.Core.YamlException附加信息(行: 4,Col: 23,Idx: 108) -(行: 5,Col: 9,Idx: 122):预期的'SequenceStart',got 'MappingStart‘(at Line: 4,Col: 23,Idx: 108)出现了“YamlDotNet.dll”类型的第一次机会例外。

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

有人能告诉我怎么处理吗?

EN

回答 1

Stack Overflow用户

发布于 2015-09-25 10:49:37

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

您将需要创建自己的集合实现,可能需要扩展HashSet<T>并实现如下所示的IDictionary<T, object>

代码语言:javascript
复制
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>成员,但这些成员是使反序列化工作所必需的。

请参阅这里一个完全工作的示例。

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

https://stackoverflow.com/questions/32757084

复制
相关文章

相似问题

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