KDe*_*ker 4 c# serialization json json.net
我正在尝试序列化一个由许多继承自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();
}
Run Code Online (Sandbox Code Playgroud)
例如我可能有一堂课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); }
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试序列化IMyDataType变量的子类时T Data,它都不会被序列化,但Min确实Max是。我需要做什么才能T Data被连载?
编辑:根据DotNetom的答案,我将访问修饰符更改T Data为public,这确实允许它被序列化。不过,它受到保护是有原因的。有没有其他方法可以在保持其访问修饰符不变的情况下对其进行序列化?
您可以简单地创建一个替代的私有属性 getterData并用属性标记它[JsonProperty]。这将允许 Json.Net “查看”它并序列化它,而无需更改原始属性的访问修饰符。
public abstract class IMyDataType<T>
{
protected virtual T Data { get; set; }
...
[JsonProperty("Value")]
private T AlternateData
{
get { return Data; }
}
}
Run Code Online (Sandbox Code Playgroud)
小提琴: https: //dotnetfiddle.net/0JMZzX
(注意:理论上,您可以只使用属性来标记受保护的Data属性本身,[JsonProperty]而不是创建备用属性 getter。但是,这似乎只有在子类中未重写基本属性时才有效。一旦您重写了它,属性由于某种原因不再有效 - 即使您将属性移至子类或将其放置在基类和子类中。我不确定这是否是 Json.Net 中的错误或有意为之。始终使用备用 getter不过似乎有效。)
| 归档时间: |
|
| 查看次数: |
6995 次 |
| 最近记录: |