C# JsonConvert.SerializeObject()在使用DateTime字段序列化类时失败
我有一个只有私有字段和它们的公共getter setter的类。我需要将类对象转换为JSON字符串,因此我使用的是JSON.Net 下面是将类对象转换为JSON字符串的简单代码段C# JsonConvert.SerializeObject()在使用DateTime字段序列化类时失败,c#,.net,c#-4.0,json.net,C#,.net,C# 4.0,Json.net,我有一个只有私有字段和它们的公共getter setter的类。我需要将类对象转换为JSON字符串,因此我使用的是JSON.Net 下面是将类对象转换为JSON字符串的简单代码段 MyClass obj = new MyClass(); string json = JsonConvert.SerializeObject(obj); Console.WriteLine(json); 但是方法SerializeObject在类型为DateTime的MyClass的字段中抛出StackOverflo
MyClass obj = new MyClass();
string json = JsonConvert.SerializeObject(obj);
Console.WriteLine(json);
但是方法SerializeObject
在类型为DateTime
的MyClass
的字段中抛出StackOverflowException
。这里发生了什么事
更新
下面是MyClass
的样子(事实上,我不介意共享实际的类)
另外,我还有另一个类,它将有MyClass
类型字段(以及它自己类似的字段集),它也将被转换为JSON字符串,这应该不会是一个问题,因为JSON.Net据说也支持这种情况
注意:我不熟悉C#但我以前在Java中使用过JSON,在Java中我可以使用
JSONObject
和JSONArray
,它们非常直接。看起来您的TestEndTime属性的getter引用本身就是如此。因此,当Json.NET尝试序列化它时,它会递归地访问自身并导致StackOverflowException
希望有帮助 您能给我们看一下MyClass吗?非常感谢!!这正是问题所在,我已经为
TestEndTime
创建了私有字段,并为其创建了类似的getter setter,现在运行良好。我认为从3.0开始,如果没有特定的私有变量原因,最好在C#中使用auto属性。使用该方法不会发生这种类型的键入错误。
class MyClass
{
private int _Model;
public int Model
{
get
{
return _Model;
}
set
{
_Model = value;
}
}
private long _ProductionControlNumber;
public long ProductionControlNumber
{
get
{
return _ProductionControlNumber;
}
set
{
_ProductionControlNumber = value;
}
}
private DateTime _ProductionDate;
public DateTime ProductionDate
{
get
{
return _ProductionDate;
}
set
{
_ProductionDate = value;
}
}
private DateTime _TestDate;
public DateTime TestDate
{
get
{
return _TestDate;
}
set
{
_TestDate = value;
}
}
private DateTime _TestStartTime;
public DateTime TestStartTime
{
get
{
return _TestStartTime;
}
set
{
_TestStartTime = value;
}
}
private TimeSpan _TestDuration;
public TimeSpan TestDuration
{
get
{
return _TestDuration;
}
set
{
_TestDuration = value;
}
}
public DateTime TestEndTime
{
get
{
//TODO Perform start end time computing logic.
return TestEndTime;
}
}
private int _TestBed;
public int TestBed
{
get
{
return _TestBed;
}
set
{
_TestBed = value;
}
}
private long _EngineSerial;
public long EngineSerial
{
get
{
return _EngineSerial;
}
set
{
_EngineSerial = value;
}
}
private Single _FuelSpecificGravity;
public Single FuelSpecificGravity
{
get
{
return _FuelSpecificGravity;
}
set
{
_FuelSpecificGravity = value;
}
}
private long _FuelConsume100;
public long FuelConsume100
{
get
{
return _FuelConsume100;
}
set
{
_FuelConsume100 = value;
}
}
private long _FuelConsume110;
public long FuelConsume110
{
get
{
return _FuelConsume100;
}
set
{
_FuelConsume100 = value;
}
}
private int _TemporaryRPM;
public int TemporaryRPM
{
get
{
return _TemporaryRPM;
}
set
{
_TemporaryRPM = value;
}
}
private int _PermanentRPM;
public int PermanentRPM
{
get
{
return _PermanentRPM;
}
set
{
_PermanentRPM = value;
}
}
private Single _RatedPower;
public Single RatedPower
{
get
{
return _RatedPower;
}
set
{
_RatedPower = value;
}
}
private int _RatedSpeed;
public int RatedSpeed
{
get
{
return _RatedSpeed;
}
set
{
_RatedSpeed = value;
}
}
private double _PulleyDiameter;
public double PulleyDiameter
{
get
{
return _PulleyDiameter;
}
set
{
_PulleyDiameter = value;
}
}
private double _RopeDiameter;
public double RopeDiameter
{
get
{
return _RopeDiameter;
}
set
{
_RopeDiameter = value;
}
}
private Single _FullLoad;
public Single FullLoad
{
get
{
return _FullLoad;
}
set
{
_FullLoad = value;
}
}
}