我有一个dynamic
成员的班级。当值为布尔值时,它被序列化为true / false
,并将其反序列化为字符串。这是YamlDotNet的问题,或者如果不是,我如何强制它序列化为true
而不是"true"
?
这是我正在尝试序列化的课程
public class Field : IField
{
public string MachineName { get; set; }
public string DisplayName { get; set; }
public FieldFormatterEnum FormatterType { get; set; }
public dynamic Value { get; set; }
public dynamic DefaultValue { get; set; }
public dynamic FormattedValue { get; set; }
...
}
键入的反序列化器方法:
public T DeserializeObject<T>(string input)
{
T o;
using (var tr = new StringReader(input))
{
o = new Deserializer().Deserialize<T>(tr);
}
return o;
}
字段位于另一个正在序列化/反序列化的类中的List
。
更新:查看序列化输出后,YamlDotNet将序列化布尔值输出为true
而不是"true"
。所以..我猜这是YamlDotNet中反序列化代码的问题?
答案 0 :(得分:0)
对于序列化,您可以创建一个仅具有getter的属性作为具有所需值的bool
:
public bool ValueAsBool
{
get
{
bool outValue = false;
if(Value is string)
{
bool.TryParse((string)Value, out outValue);
return outValue;
}
return outValue;
}
}
最终,在使用dynamic
时,您将丢弃一些类型信息,而您不应该期望能够正确地恢复所有信息。
答案 1 :(得分:0)
我刚刚设置了一个简单的测试,如:
class Foo
{
public dynamic V { get; set; }
}
var f1 = new Foo(){V = 5};
var tw2 = new StringWriter();
new Serializer().Serialize(tw2, f1);
var tr2 = new StringReader(tw2.ToString());
var f_1 = new Deserializer().Deserialize<Foo>(tr2);
... V
被反序列化为"5"
。要反序列化的默认类型是string