gpt4 book ai didi

c# - 如何反序列化不可变数据结构?

转载 作者:行者123 更新时间:2023-12-05 07:54:03 25 4
gpt4 key购买 nike

我如何将 YAML 反序列化为不可变数据结构?

例如我有这个 YAML:

Value: SomeString
Number: 99

这个数据结构:

public class MyData
{
public MyData(string value, int number)
{
Value = value;
Number = number;
}

public string Value { get; }
public int Number { get; }
}

为此,我将使用构造函数。所以不知何故我需要先检索一个 Dictionary<string, object>从关于我的类的 YAML 中解析(所以 99 是整数,而不是字符串),然后扫描我的类型以找到合适的构造函数,

最佳答案

虽然问题没有提及,但我假设您使用的是 YamlDotNet(或 SharpYaml,它是 YamlDotNet 的一个分支)

YamlDotNet 不支持反序列化为没有默认构造函数的类 - 但实现所需功能的一种选择是反序列化为可变的中间 Builder 类型,该类型可以生成最终类型。例如

public class MyDataBuilder
{
public string Value { get; set; }
public int Number { get; set; }
public MyData Build() => new MyData(Value, Number);
}

然后使用类似的东西:

deserializer.Deserialize<MyDataBuilder>(yaml).Build();

然而,您最终将不得不为整个模型创建一组平行的构建器,例如如果 MyData 具有类型为 MyOtherData 的第三个参数(我已将示例更改为使用记录而不是类以使其简洁):

public record MyOtherData(string OtherValue);
public record MyData(string Value, int Number, MyOtherData otherData);

在这种情况下,我们需要另一个 Builder:

public class MyOtherDataBuilder 
{
public string OtherValue { get; set; }
}

MyDataBuilder 看起来像:

public class MyDataBuilder
{
public string Value { get; set; }
public int Number { get; set; }
public MyOtherDataBuilder MyOtherData { get; set; }
public MyData Build() => new MyData(Value, Number, MyOtherData.Build());
}

关于c# - 如何反序列化不可变数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31886045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com