【问题标题】:JsonConvert.SerializeObject() fails in serializing class with DateTime fieldsJsonConvert.SerializeObject() 无法用 DateTime 字段序列化类
【发布时间】:2013-02-10 11:33:27
【问题描述】:

我的课程只有私有字段及其公共 getter-setter。我需要将类对象转换为 JSON 字符串,因此我使用的是 JSON.Net。

下面是一个简单的 sn-p 将类对象转换为 JSON 字符串。

MyClass obj = new MyClass();
string json = JsonConvert.SerializeObject(obj);
Console.WriteLine(json);

但是SerializeObject 方法在MyClass 类型DateTime 的字段中抛出StackOverflowException。这里发生了什么?

更新

以下是MyClass 的样子(实际上,我不介意分享实际课程)

    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;
            }
        }
    }

另外,我将有另一个类,它将具有 MyClass 类型字段(以及它自己的类似字段集),它也将被转换为 JSON 字符串,这不应该是一个问题,因为据说 JSON.Net 也支持这种情况。

注意:我是 C# 新手,但我之前在 Java 中使用过 JSON,我可以在其中使用 JSONObjectJSONArray,它们非常简单。

【问题讨论】:

  • 你能告诉我们MyClass吗?

标签: c# .net c#-4.0 json.net


【解决方案1】:

看起来您的 TestEndTime 属性的 getter 引用了自身。因此,当 Json.NET 尝试对其进行序列化时,它会递归访问自身并导致 StackOverflowException。

希望有帮助!

【讨论】:

  • 非常感谢!!这正是问题所在,我为TestEndTime 创建了私有字段,并为其创建了类似的getter-setter,现在可以正常工作了。
  • 我认为如果私有变量没有特定原因,最好在 C# 3.0 中使用自动属性。使用该方法不会发生这种类型的错误输入。
猜你喜欢
  • 2021-05-22
  • 2015-08-26
  • 2021-11-08
  • 2022-01-12
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多