gpt4 book ai didi

c# - 使用 Json.NET 序列化泛型类中的 protected 属性

转载 作者:行者123 更新时间:2023-11-30 14:27:24 25 4
gpt4 key购买 nike

我正在尝试序列化一个由许多变量组成的类,这些变量全部继承自 IMyDataType

public abstract class IMyDataType<T>
{
protected virtual T Data { get; set; }
public abstract String ToString(String args = null);
public abstract Boolean SetValue(T newValue);
public abstract Boolean CheckValue(T newValue);
public abstract T GetValue();
}

例如我可能有一个类 MyInteger

public class MyInteger : IMyDataType<int>
{
public int Min { get; protected set; }
public int Max { get; protected set; }
protected override int Data { get; set; }

public MyInteger(int value)
{
Min = int.MinValue;
Max = int.MaxValue;
if (!SetValue(value))
Data = 0;
}

public MyInteger(int min, int value, int max)
{
Min = min;
Max = max;
if (!SetValue(value))
Data = 0;
}

public override Boolean SetValue(int newVal)
{
if (newVal >= Min && newVal <= Max)
{
Data = newVal;
return true;
}
return false;
}

public override Boolean CheckValue(int newVal)
{
return (newVal >= Min && newVal <= Max);
}

public override int GetValue() { return Data; }
public override String ToString(String args = null) { return Data.ToString(args); }
}

每当我尝试序列化 IMyDataType 的子类时,变量 T Data 永远不会被序列化,尽管 MinMax 是。我需要做什么才能使 T 数据 序列化?

编辑:根据 DotNetom 的回答,我将 T Data 的访问修饰符更改为 public,这确实允许它被序列化。不过,它受到保护是有原因的。有没有其他方法可以在保持其访问修饰符不变的情况下序列化它?

最佳答案

您可以简单地为 Data 创建一个备用的 private 属性 getter 并用 [JsonProperty] 属性标记它。这将允许 Json.Net “看到”它并对其进行序列化,而无需更改原始属性的访问修饰符。

public abstract class IMyDataType<T>
{
protected virtual T Data { get; set; }
...

[JsonProperty("Value")]
private T AlternateData
{
get { return Data; }
}
}

fiddle :https://dotnetfiddle.net/0JMZzX

(注意:理论上,您可以只使用 [JsonProperty] 属性标记 protected Data 属性本身,而不是创建备用属性 getter。但是,这仅如果未在子类中覆盖基属性,则似乎可以工作。一旦覆盖它,该属性将由于某种原因不再起作用——即使您将属性移动到子类或将它放在基类和子类中。我我不确定这是 Json.Net 中的错误还是故意的。不过,使用备用 getter 似乎总是有效。)

关于c# - 使用 Json.NET 序列化泛型类中的 protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32954147/

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