如何在YamlDotNet中区分“true”和boolean true

时间:2015-04-09 14:33:41

标签: c# yamldotnet

我有一个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中反序列化代码的问题?

2 个答案:

答案 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