0

我有一个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和 not "true"。所以.. 我猜这是 YamlDotNet 中的反序列化代码的问题?

4

2 回答 2

0

对于序列化,您可以创建一个仅限 getter 的属性作为bool具有您想要的值的 a:

public bool ValueAsBool
{
    get
    {
        bool outValue = false;
        if(Value is string)
        {
            bool.TryParse((string)Value, out outValue);
            return outValue;
        }
        return outValue;
    }
}

最终,在使用dynamics 时,您将丢弃一些类型信息,并且您不应该期望能够正确地恢复所有这些信息。

于 2015-04-09T14:41:26.830 回答
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

于 2015-04-09T15:05:31.690 回答