2010-11-28 5 views
0

Je désérialisation cette chaîne JSON:Comment utiliser Activator.CreateInstance avec liste <T> lorsque Deserialize JSON avec DataContractJsonSerializer

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

La classe qui représente les articles est:

[DataContract] 
public class MyClass 
{ 

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

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

     private DateTime _dtcreate; 
} 

Notez que dans le constructeur par défaut de MyClass I a défini une valeur par défaut pour "_dtcreate".

Donc, j'utilise ce code pour Désérialise JSON dans un tableau de 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; 
    } 

Quand je deserialize une chaîne JSON je ne trouve pas dans mon tableau désérialisé la propriété « _dtcreate » evalued.

Je pense que DataContractJsonSerializer n'utilise pas le constructeur par défaut de MyClass.

Puis-je utiliser

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

pour créer une instance pour tous les objets appartenant au tableau « GTYPE » pour me faire assurer que tous les objets de ma liste deserialiced ​​sont créés avec le constructeur dafault de ma classe T ?

Merci beaucoup!

+0

'DateTime' est une structure. Votre constructeur est complètement inutile. – SLaks

Répondre

1

Les sérialiseurs DataContract n'exécuteront pas les constructeurs. Au lieu de cela, vous devriez mettre votre logique dans an [OnDeserializing] method.

+0

Merci! J'ai mis this._dtcreate = new DateTime(); dans le OnDeserializedMethod et fonctionne bien .. –

+0

@Nicola: Vous n'avez pas besoin de faire cela du tout. Puisque DateTime est un type de valeur, il sera automatiquement défini à sa valeur par défaut. Cela ne peut pas être "nul". Vous recherchez peut-être 'DateTime.Now'. – SLaks

+0

La propriété "_dtcreate" n'est qu'un exemple. J'ai vraiment une propriété de chaîne à définir avec une valeur par défaut. Merci pour le soutien! –

Questions connexes