本代码,带有公共列表可用于序列化和挑战:
internal class PoSet<T>
{
public List<PossibleOutcome<T>> WeightedValues = new();
public PoSet() { }
public PoSet(IEnumerable<PossibleOutcome<T>> weightedValues)
{
if (weightedValues == null)
throw new ArgumentNullException(nameof(weightedValues));
WeightedValues.AddRange(weightedValues);
}
public void Add(PossibleOutcome<T> weightedValue)
{
if (weightedValue == null)
throw new ArgumentNullException(nameof(weightedValue));
WeightedValues.Add(weightedValue);
}
}
...但是,此代码仅公开一个可读列表并使用JSON构造函数属性不适用于序列化,但不能用于进行序列化。我尝试了几个JSON属性变体:
internal class PoSet<T>
{
private List<PossibleOutcome<T>> _weightedValues = new();
public IReadOnlyList<PossibleOutcome<T>> WeightedValues => _weightedValues.AsReadOnly();
[JsonConstructor]
public PoSet(List<PossibleOutcome<T>> weightedValues) //Constructor for the deserializer
{
if (weightedValues == null)
throw new ArgumentNullException(nameof(weightedValues));
_weightedValues.AddRange(weightedValues);
}
public PoSet() { }
public PoSet(IEnumerable<PossibleOutcome<T>> weightedValues)
{
if (weightedValues == null)
throw new ArgumentNullException(nameof(weightedValues));
_weightedValues.AddRange(weightedValues);
}
public void Add(PossibleOutcome<T> weightedValue)
{
if (weightedValue == null)
throw new ArgumentNullException(nameof(weightedValue));
_weightedValues.Add(weightedValue);
}
}
任何帮助的人都非常感谢。当然,这是可能的。我已经读过一些有关合同的信息,但这似乎超出了我的能力(这是爱好的东西;我不是真正的程序员)。BTW如果有帮助,这是可能的类别:
// Generic WeightedValue class (for any type T)
internal class PossibleOutcome<T>
{
public T Value { get; set; }
public double Weight { get; set; }
public PossibleOutcome() { } // Parameterless constructor for deserialization
public PossibleOutcome(T value, double weight)
{
if (weight < 0)
throw new ArgumentException("Weight cannot be negative.", nameof(weight));
Value = value;
Weight = weight;
}
}
我认为您使用的库是system.text.json,因为json.net可以正常地对此类别化。 system.text.json的规则有些木制,它要求每个参数必须能够匹配属性(或字段),它们的名称和类型必须一致(名称是对案例不敏感的),因此您需要将参数类型更改为
JsonConstructor