2013-02-10 2 views
1

개인 필드와 공용 getter-setter 만있는 클래스가 있습니다. JSON String으로 클래스 객체를 변환해야하므로 JSON.Net을 사용하고 있습니다.JsonConvert.SerializeObject()가 DateTime 필드로 클래스 직렬화에 실패했습니다.

다음은 클래스 개체를 JSON 문자열로 변환하는 간단한 스 니펫입니다.

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

그러나 방법 SerializeObject 유형 DateTimeMyClass에 필드에 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# 새로운 해요 그러나 나는 이전에 내가 JSONObjectJSONArray와 함께 플레이를 할 수 자바에서 JSON으로 근무했습니다, 그들은 매우 정직하고 있었다.

+1

'MyClass'도 표시 할 수 있습니까? –

답변

3

TestEndTime 속성의 getter가 자체적으로 참조하는 것처럼 보입니다. 따라서 Json.NET이 직렬화하려고하면 재귀 적으로 자체에 액세스하여 StackOverflowException이 발생합니다.

희망 하시겠습니까?

+1

고마워요 !! 그게 정확히 문제 였어, 나는'TestEndTime'과 비슷한 getter-setter를위한 private 필드를 만들었고 이제는 잘 작동한다. – Kushal

+1

개인 변수에 대한 특별한 이유가없는 경우 3.0의 C#에서 자동 속성을 사용하는 것이 더 좋습니다. 이 유형의 오타는 해당 메소드에서 발생하지 않습니다. – beawolf

관련 문제