You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Serilog序列化对象仅输出_typeTag但JsonConvert可正常序列化问题咨询

问题原因
  • 最常见的诱因是SubmitImportJobRequest类实现了IEnumerable接口:Serilog默认序列化逻辑会将实现IEnumerable的类型识别为集合类型,若该集合实例为空,就只会输出_typeTag标识,不会序列化类的其他成员。
  • 其次可能是该类标记了[DataContract]特性但未给需要序列化的属性添加[DataMember]特性:Serilog默认序列化器会遵循数据契约约定,未标记[DataMember]的成员不会被序列化输出。
  • 也有可能是该类的属性均无公共getter:Serilog默认仅序列化公共可读的类属性,无公共访问器的属性会被自动忽略。
解决办法

方案1:修正类定义或添加序列化标记

如果确认SubmitImportJobRequest实现了IEnumerable但不需要按集合类型序列化,直接给类添加[DestructureAsObject]特性,强制Serilog将其作为普通对象处理即可。如果使用了[DataContract],给需要输出的属性补充[DataMember]标记。

方案2:配置Serilog使用Newtonsoft.Json序列化器

对齐你常用的JsonConvert序列化逻辑,避免两边序列化规则不一致的问题:

  1. 首先安装NuGet包Serilog.Sinks.NewtonsoftJson
  2. 调整Serilog配置,示例如下:
new LoggerConfiguration()
    // 其他原有配置
    .WriteTo.ApplicationInsights(
        telemetryClient, 
        TelemetryConverter.Events(),
        new NewtonsoftJsonFormatter(new JsonSerializerSettings
        {
            // 此处填写你平时使用JsonConvert时的配置项,保证序列化逻辑完全一致
            ContractResolver = new DefaultContractResolver(),
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        }))
    .CreateLogger();

方案3:显式指定该类型的解构规则

全局配置Serilog对SubmitImportJobRequest的序列化逻辑,无需修改类定义:

new LoggerConfiguration()
    .Destructure.ByTransforming<SubmitImportJobRequest>(req => new 
    {
        // 按需求列出需要输出的属性即可
        req.JobId,
        req.BatchSize,
        req.ImportParams
    })
    // 其他原有配置

临时应急方案

如果只是临时需要输出完整对象,打日志时提前序列化即可:

_logger.LogInformation("myserilog {submitImportJobRequest}", JsonConvert.SerializeObject(submitImportJobRequest));

内容的提问来源于stack exchange,提问作者techno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:48:03