gpt4 book ai didi

c# - Json 反序列化 protected 属性

转载 作者:行者123 更新时间:2023-12-01 01:46:18 40 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Json.net serialize specific private field

(2 个回答)



JSON.net: how to deserialize without using the default constructor?

(6 个回答)



Json.Net - Explicitly include a single private property

(1 个回答)


4年前关闭。




我有一个类属性集,并在构造函数中固定,下面的示例是 Guid.NewGuid() ..

基本原理是只允许类在创建时填充.. 所以它在构造函数中设置,并且只标记为 get; - 工作正常,直到我序列化/反序列化为 Json。

好像是因为没有set;反序列化失败..构造函数介入并创建一个新的guid

我已经尝试过内部、私有(private)和 protected 集合 .. 但所有这些都会导致属性的重新生成,我可以让它工作的唯一方法是将 Id 标记为 {get;set;} ,

class Foo
{
public Foo() => Id = Guid.NewGuid().ToString();
public string Id { get; set; }
}

这意味着您可以简单地执行以下操作:
var obj = new Foo();
obj.Id = "Any Old Rubbish";

有没有办法解决这个问题?

短样本:
class Program
{
static void Main()
{
var obj = new Foo();
Console.WriteLine(obj.Id);

var serialize = JsonConvert.SerializeObject(obj);
var deserialize = JsonConvert.DeserializeObject<Foo>(serialize);
Console.WriteLine(deserialize.Id);

Console.ReadLine();
}
}

class Foo
{
public Foo() => Id = Guid.NewGuid().ToString();

public string Id { get; }
}

输出:
7868a298-f20d-4719-85ef-ba64c8658819
34fe422c-9555-4d17-ae1a-9fbf21af1b71

最佳答案

下图(不是我做的,但可以在 this 问题中找到)显示了 JsonConvert.DeserializeObject 的算法。作品。如您所见,序列化类型的构造函数几乎总是被调用。这就是为什么您必须使用带有参数的构造函数,如图像最左边的路径所示。

JsonConvert.DeserializeObject algorithm

下面显示了使用带参数的构造函数对示例的修改。

class Program
{
static void Main()
{
var obj = new Foo(Guid.NewGuid().ToString());
Console.WriteLine(obj.Id);

var serialize = JsonConvert.SerializeObject(obj);
var deserialize = JsonConvert.DeserializeObject<Foo>(serialize);
Console.WriteLine(deserialize.Id);

Console.ReadLine();
}
}

class Foo
{
public Foo(String Id) => this.Id = Id;
public string Id { get; }
}

这将导致序列化前后具有相同的 guid,而无需使用 public string Id { get; set;}因为你不想。

关于c# - Json 反序列化 protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029407/

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