【问题标题】:System.Text.Json source generation and TimeSpanSystem.Text.Json 源代码生成和 TimeSpan
【发布时间】:2022-01-07 03:18:58
【问题描述】:

我正在尝试将System.Text.Json 与源代码生成一起使用。不幸的是,我有一个类有一个需要序列化的TimeSpan 数据成员。但是,我无法让它与源生成一起使用,因为它总是试图序列化私有数据成员_ticks。 我不知道是否有办法禁用给定类型的源生成并改用用户提供的源生成。 我什至试图忽略这些字段,但似乎没有考虑到:

[JsonSerializable(typeof(Test))]
partial class Context : JsonSerializerContext
{
}

public class Test
{
    public string Name { get; set; }

    [JsonIgnore]
    public TimeSpan Span { get; set; }
}

仍然报以下错误:

'TimeSpan._ticks' 由于其保护级别而无法访问

您知道是否有解决方法吗?

这是产生错误的源代码生成部分: 这是生成的 TimeSpan 序列化源的一部分,它是导致错误的源,它是生成的 Context.TimeSpan.g.cs 文件的一部分:

global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.Int64> info11 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues<global::System.Int64>()
{
    IsProperty = false,
    IsPublic = false,
    IsVirtual = false,
    DeclaringType = typeof(global::System.TimeSpan),
    PropertyTypeInfo = jsonContext.Int64,
    Converter = null,
    Getter = static (obj) => ((global::System.TimeSpan)obj)._ticks,
    Setter = static (obj, value) => global::System.Runtime.CompilerServices.Unsafe.Unbox<global::System.TimeSpan>(obj)._ticks = value!,
    IgnoreCondition = null,
    HasJsonInclude = false,
    IsExtensionData = false,
    NumberHandling = default,
    PropertyName = "_ticks",
    JsonPropertyName = null
};

【问题讨论】:

  • TimeSpan 在哪里,_ticks 在哪里?
  • TimeSpan 在我的班级中,就像在Test 班级中一样,但是_ticksSystem.TimeSpan 班级中

标签: c# serialization system.text.json sourcegenerators


【解决方案1】:

如果您需要帮助,您应该发布真正的代码。您必须有一些使用 TimeSpan._ticks 的代码。尝试将其更改为 TimeSpan.Ticks。

【讨论】:

  • 源码生成器生成读写_ticks的代码。这不是我的代码。但如果你愿意,我可以发布源代码。
  • @VictorBurckel 这意味着源生成器创建了异常。发布它
  • 是的,但是我想知道是否有任何方法可以绕过给定类型/成员的源生成器,我不介意为该类型编写自定义生成器。但我知道异常来自源生成器生成的源。
  • @VictorBurckel 这超出了原始问题的范围。您已经使用我的答案来更新您的问题。够了。
猜你喜欢
  • 2021-12-27
  • 2022-07-28
  • 2023-03-20
  • 2015-05-07
  • 2011-06-05
  • 2023-03-13
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多