我正在尝试反序列化一些在序列化SnakeYaml HashSet时设置为由HashSet创建的字符串的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.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的一个非常常见的要求,但我不知道如何解决这个问题。
有人能告诉我怎么处理吗?
发布于 2015-09-25 10:49:37
问题是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>成员,但这些成员是使反序列化工作所必需的。
https://stackoverflow.com/questions/32757084
复制相似问题