首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反序列化对象时引发YamlDotNet异常

反序列化对象时引发YamlDotNet异常
EN

Stack Overflow用户
提问于 2019-12-20 00:54:18
回答 1查看 669关注 0票数 2

所以,我是Yaml和YamlDotNet的新手。我写了下面的代码来解析我用来配置客户端API的yaml文件……

代码语言:javascript
复制
public bool TryGet(string path, out DiagnosticScannerConfig config)
{
    var deserializer = new DeserializerBuilder()
        .WithNamingConvention(new HyphenatedNamingConvention())
        .Build();

    try
    {
        using (var reader = File.OpenText(path))
        {
            var deserializedConfig = deserializer.Deserialize<InternalDiagnosticScannerConfig>(reader);

            config = new DiagnosticScannerConfigImpl(deserializedConfig);
            return true;
        }
    }
    catch (Exception e)
    {
        config = DiagnosticAnalyzerConfigCache.Default;
        return true;
    }
}

public interface DiagnosticScannerConfig
{
    DiagnosticAnalyzerConfig Analyzer { get; }
}

public interface DiagnosticAnalyzerConfig
{
    uint HighClosureRateWarningThreshold { get; }
    uint HighCreationRateWarningThreshold { get; }
    uint QueueHighFlowThreshold { get; }
    uint QueueLowFlowThreshold { get; }
    decimal MessageRedeliveryCoefficient { get; }
    decimal SocketUsageCoefficient { get; }
    decimal RuntimeProcessUsageCoefficient { get; }
    decimal FileDescriptorUsageWarningCoefficient { get; }
    decimal ConsumerUtilizationWarningCoefficient { get; }
}

class DiagnosticScannerConfigImpl : DiagnosticScannerConfig
{
    public DiagnosticScannerConfigImpl(InternalDiagnosticScannerConfig config)
    {
        Analyzer = new DiagnosticAnalyzerConfigImpl(config.Analyzer);
    }

    class DiagnosticAnalyzerConfigImpl : DiagnosticAnalyzerConfig
    {
        public DiagnosticAnalyzerConfigImpl(Analyzer config)
        {
            HighClosureRateWarningThreshold = config.HighClosureRateWarningThreshold;
            HighCreationRateWarningThreshold = config.HighCreationRateWarningThreshold;
            QueueHighFlowThreshold = config.QueueHighFlowThreshold;
            QueueLowFlowThreshold = config.QueueLowFlowThreshold;
            MessageRedeliveryCoefficient = config.MessageRedeliveryCoefficient;
            SocketUsageCoefficient = config.SocketUsageCoefficient;
            RuntimeProcessUsageCoefficient = config.RuntimeProcessUsageCoefficient;
            FileDescriptorUsageWarningCoefficient = config.FileDescriptorUsageWarningCoefficient;
            ConsumerUtilizationWarningCoefficient = config.ConsumerUtilizationWarningCoefficient;
        }

        public uint HighClosureRateWarningThreshold { get; }
        public uint HighCreationRateWarningThreshold { get; }
        public uint QueueHighFlowThreshold { get; }
        public uint QueueLowFlowThreshold { get; }
        public decimal MessageRedeliveryCoefficient { get; }
        public decimal SocketUsageCoefficient { get; }
        public decimal RuntimeProcessUsageCoefficient { get; }
        public decimal FileDescriptorUsageWarningCoefficient { get; }
        public decimal ConsumerUtilizationWarningCoefficient { get; }
    }

    public DiagnosticAnalyzerConfig Analyzer { get; }
}


public class Analyzer
{
    [YamlMember(Alias = "high-closure-rate-warning-threshold")]
    public uint HighClosureRateWarningThreshold { get; set; }

    [YamlMember(Alias = "high-creation-rate-warning-threshold")]
    public uint HighCreationRateWarningThreshold { get; set; }

    [YamlMember(Alias = "queue-high-flow-threshold")]
    public uint QueueHighFlowThreshold { get; set; }

    [YamlMember(Alias = "queue-low-flow-threshold")]
    public uint QueueLowFlowThreshold { get; set; }

    [YamlMember(Alias = "message-redelivery-coefficient")]
    public decimal MessageRedeliveryCoefficient { get; set; }

    [YamlMember(Alias = "socket-usage-coefficient")]
    public decimal SocketUsageCoefficient { get; set; }

    [YamlMember(Alias = "runtime-process-usage-coefficient")]
    public decimal RuntimeProcessUsageCoefficient { get; set; }

    [YamlMember(Alias = "file-descriptor-usage-warning-coefficient")]
    public decimal FileDescriptorUsageWarningCoefficient { get; set; }

    [YamlMember(Alias = "consumer-utilization-warning-coefficient")]
    public decimal ConsumerUtilizationWarningCoefficient { get; set; }
}

public class InternalDiagnosticScannerConfig
{
    public Analyzer Analyzer { get; }
}

我尝试解析以下yaml文件:

代码语言:javascript
复制
---
    high-closure-rate-warning-threshold:  90
    high-creation-rate-warning-threshold: 60
    queue-high-flow-threshold:  90
    queue-low-flow-threshold: 10
    message-redelivery-coefficient: 0.60
    socket-usage-coefficient: 0.60
    runtime-process-usage-coefficient:  0.65
    file-descriptor-usage-warning-coefficient:  0.65
    consumer-utilization-warning-coefficient: 0.65
...

当我执行上面的代码时,我得到了以下错误:

System.Runtime.Serialization.SerializationException::(行: 2,列: 5,Idx: 8) -(行: 2,列: 5,Idx: 8):反序列化过程中出现异常->在类型'HareDu.Diagnostics.Configuration.InternalDiagnosticScannerConfig'.上未找到YamlDotNet.Core.YamlException属性'high-closure-rate-warning-threshold‘在YamlDotNet.Serialization.TypeInspectors.TypeInspectorSkeleton.GetProperty(Type类型,对象容器,字符串名称,布尔值)在YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser解析器,类型expectedType,函数nestedObjectDeserializer,对象和值)在YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser解析器,类型expectedType,SerializerState状态,IValueDeserializer nestedObjectDeserializer) -内部异常堆栈跟踪的结束-在YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser解析器,类型expectedType,SerializerState状态,在YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser解析器处,键入expectedType,SerializerState状态,IValueDeserializer nestedObjectDeserializer)在YamlDotNet.Serialization.Deserializer.Deserialize(IParser解析器处,类型类型)在/Users/albert/Documents/Git/HareDu2/src/HareDu.Diagnostics/Configuration/DiagnosticScannerConfigProvider.cs:line 59中,在YamlDotNet.Serialization.Deserializer.DeserializeT处HareDu.Diagnostics.Configuration.DiagnosticScannerConfigProvider.TryGet(String路径处,诊断扫描配置和配置

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-21 08:21:54

异常消息告诉您问题:您的类型InternalDiagnosticScannerConfig没有“高闭合率-警告-阈值”属性。实际上,在您的代码中,该属性是在Analyzer类中定义的。您应该反序列化到该类型,或者更新您的YAML,使其结构反映您的类。

在实践中,可以使用以下两种方法:

代码语言:javascript
复制
deserializer.Deserialize<InternalDiagnosticScannerConfig>(reader);

或者这样:

代码语言:javascript
复制
---
analyzer:
    high-closure-rate-warning-threshold:  90
    high-creation-rate-warning-threshold: 60
    queue-high-flow-threshold:  90
    queue-low-flow-threshold: 10
    message-redelivery-coefficient: 0.60
    socket-usage-coefficient: 0.60
    runtime-process-usage-coefficient:  0.65
    file-descriptor-usage-warning-coefficient:  0.65
    consumer-utilization-warning-coefficient: 0.65
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59413956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档