2010-11-28 2 views
0
와 역 직렬화 된 JSON

나는이 JSON 문자열 직렬화 복원 해요 :목록 <T>와 Activator.CreateInstance로 사용하는 방법 경우 DataContractJsonSerializer

[{"id":"1"},{"id":"2"},{"id":"3"}] 

이 항목을 나타내는 클래스는 다음과 같습니다에서 그

[DataContract] 
public class MyClass 
{ 

     public MyClass() { 
      this._dtcreate = new DateTime(); 
     } 

     private int _id; 
     [DataMember(Name = "id")] 
     public int Id {get;set;} 

     private DateTime _dtcreate; 
} 

주 MyClass의 기본 생성자 "_dtcreate"에 대한 기본값을 설정했습니다.

그래서, T의 배열로 JSON을 역 직렬화이 코드를 사용하고 있습니다 :

public static T[] DeserializeArray<T>(string json) 
    { 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T[])); 
     MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); 
     T[] gType = (T[])ser.ReadObject(ms); 
     return gType; 
    } 

을 나는 재산 "_dtcreate"evalued 내 직렬화 된 배열에서 찾을 수 없습니다 JSON 문자열을 역 직렬화합니다.

DataContractJsonSerializer가 MyClass의 기본 생성자를 사용하지 않는다고 생각합니다.

나는 나를 deserialiced ​​내 목록의 모든 개체 내 T 클래스의 dafault 생성자로 생성되는 것을 보장하기 위해 배열 "gType"에 속하는 모든 개체에 대한 인스턴스를 만들 수

T obj = Activator.CreateInstance<T>(); 

를 사용할 수 ?

정말 고마워요!

+0

'DateTime'은 구조체입니다. 귀하의 생성자는 완전히 쓸모가 없습니다. – SLaks

답변

1

DataContract serializer는 생성자를 실행하지 않습니다.

대신 논리를 an [OnDeserializing] method에 입력해야합니다.

+0

고마워요! 나는 이것을 설정했다 ._dtcreate = new DateTime(); OnDeserializedMethod에서 잘 작동합니다. –

+0

@Nicola : 전혀 그렇게 할 필요가 없습니다. DateTime은 값 유형이기 때문에 자동으로 기본값으로 설정됩니다. 'null'일 수 없습니다. 당신은'DateTime.Now'를 찾고있을 것입니다. – SLaks

+0

"_dtcreate"속성은 예제 일뿐입니다. 정말 디폴트 값으로 설정할 문자열 속성이 있습니다. 도와 줘서 고마워! –

관련 문제