2010-11-28 6 views
0

Я десериализации эту JSon строку:Как использовать Activator.CreateInstance со списком <T> при Deserialize с DataContractJsonSerializer JSON

[{"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».

Итак, я использую этот код Deserialize JSON в массив T:

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

Когда я десериализацию строки JSON, я не нашел в моем десериализованный массива свойства «_dtcreate» evalued.

Я думаю, что DataContractJsonSerializer не использует конструктор по умолчанию MyClass.

Могу ли я использовать

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

создать экземпляр для всех объектов, принадлежащих к массиву «GType», чтобы заставить меня убедиться, что все объекты в моем списке deserialiced ​​создаются с dafault конструктор моего T класса ?

Большое вам спасибо!

+0

`DateTime` - это структура. Ваш конструктор совершенно бесполезен. – SLaks 2010-11-28 19:08:55

ответ

1

Сериализаторы DataContract не будут запускать конструкторы.

Вместо этого вы должны поместить свою логику в an [OnDeserializing] method.

+0

Спасибо! Я установил this._dtcreate = new DateTime(); в OnDeserializedMethod и отлично работать. – 2010-11-28 19:14:55