【发布时间】:2020-07-06 15:11:52
【问题描述】:
我正在尝试序列化一个类,预期的行为是它成功了。它没有成功,标题中有错误。标题是错误的子集,因为完整的标题不适合。
这是完整的错误:
System.Text.Json.JsonException HResult=0x80131500 消息=A 检测到不支持的可能对象循环。这个可以 要么是由于一个循环,要么是物体深度大于 最大允许深度为 5。
我有一个无法序列化的非常简单的模型,并且使用 [JsonIgnore] 跳过属性的选项不可行。
类模型的样子;
Package 有一个属性 Steps,它是 Step 的 IList Step 有一个 Constraints 属性,它是一个 IList of Constraint。
当我尝试使用此代码进行序列化时;
public static class PackageIO
{
public static void SaveAsJsonFile(Package pkg, string FullyQualifiedFileName)
{
string jsonString;
//TODO: Needs Exception handler
var options = new JsonSerializerOptions
{
WriteIndented = true,
MaxDepth = 5
};
jsonString = JsonSerializer.Serialize(pkg, options);
File.WriteAllText(FullyQualifiedFileName, jsonString);
}
}
我得到了例外。这是 .Net Core 3.1,并且该库不在网络应用程序中,因此我无法(轻松)切换到我有时建议的 MVC Newtonsoft 序列化程序。
如果我删除了上面的 Constraints 属性,那么它就可以序列化。这是 JSON 的样子;
{
"Steps": [
{
"Name": "stepTestName"
}
],
"Name": "packageTestName"
}
这是包类的样子;
public class Package
{
private string _name;
private Steps<Step> _steps;
public Package()
{
_steps = new Steps<Step>();
}
public Package(string name) : this()
{
_name = name;
}
public Steps<Step> Steps
{
get { return _steps; }
set { _steps = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
Step 类如下所示;
public enum StepExecStatus
{
Waiting = 1,
InProgress = 2,
Inactive = 3,
Completed = 4
}
public class Step
{
private string _name;
private PrecedenceConstraints<PrecedenceConstraint> _precedenceConstraints;
private StepExecStatus _execStatus;
#region INTERNAL PROPERTIES
internal StepExecStatus ExecStatus
{
get { return _execStatus; }
set { _execStatus = value; }
}
#endregion
#region INTERNAL METHODS
internal StepExecStatus Execute()
{
return StepExecStatus.Completed;
}
#endregion
#region PUBLIC PROPERTIES
public string Name
{
get { return _name; }
set { _name = value; }
}
public PrecedenceConstraints<PrecedenceConstraint> PrecedenceConstraints
{
get { return _precedenceConstraints; }
set { _precedenceConstraints = value; }
}
#endregion
#region PUBLIC METHODS
public Step()
{
_precedenceConstraints = new PrecedenceConstraints<PrecedenceConstraint>();
_execStatus = StepExecStatus.Waiting;
}
#endregion
}
下面是 Steps 集合的顶部,它现在只是一个基本的 IList 实现:
public class Steps<T> : IList<T> where T:Step
{
private readonly List<T> _steps = new List<T>();
这里是约束类;
public enum StepPrecedenceValue
{
Completion = 1,
Success = 2,
Failure = 3
}
public class PrecedenceConstraint
{
private string _sourceStepName;
private StepPrecedenceValue _constraintValue;
private bool _constraintMet;
public PrecedenceConstraint(string itemName, StepPrecedenceValue value)
{
_sourceStepName = itemName;
_constraintValue = value;
}
public string SourceStepName
{
get { return _sourceStepName; }
set { _sourceStepName = value; }
}
public StepPrecedenceValue ConstraintValue
{
get { return _constraintValue; }
set { _constraintValue = value; }
}
public bool ConstraintMet
{
get { return GetConstraintMet(); }
set { _constraintMet = value; }
}
private bool GetConstraintMet()
{
bool result = false;
//TODO: Needs implemented
return result;
}
}
这里是 Constraints 类,现在又是一个基本的 IList 实现;
public class PrecedenceConstraints<T> : IList<T> where T:PrecedenceConstraint
{
private readonly IList<T> _precedenceConstraints = new List<T>();
谢谢
【问题讨论】:
-
你能显示json和
Package类吗? -
请同时显示
Step类和Constraint类。 -
无法使用显示的类进行复制,请参阅dotnetfiddle.net/XMuFq0。我们需要查看minimal reproducible example 来帮助您,其中将包括说明问题的
Steps<T>、Step和Constraint类型的定义。请参阅:How to Ask。 -
@dbc 这里是小提琴dotnetfiddle.net/c0dRLs
标签: c# json serialization