如何处理!!
本文关键字:处理 何处理 | 更新日期: 2023-09-27 18:14:25
我正在尝试反序列化一些有!!在序列化Java HashSet时由SnakeYaml创建的字符串中设置。不同的泛型类型被序列化,例如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
我一开始得到exception:
附加信息:无法加载文件或程序集'2002:set'或其依赖项之一。系统找不到指定的文件
为了修复,我将标记映射注册到反序列化器:
{"tag:yaml.org,2002:set", typeof (HashSet<object>)}
然后得到exception:
类型为"YamlDotNet.Core"的第一次机会异常。在YamlDotNet.dll中发生了YamlException'附加信息:(Line: 4, Col: 23, Idx: 108) - (Line: 5, Col: 9, Idx: 122):期望'SequenceStart',得到'MappingStart' (Line: 4, Col: 23, Idx: 108).
我本以为处理集合是YAML的一个非常常见的需求,但是我不知道如何解决这个问题。
谁能告诉我如何处理?问题是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>
的更多成员,但这些是使反序列化工作所必需的。
查看完整的工作示例