2010-11-28 2 views
0

Ich Deserialisieren dieses json string:So verwenden Activator.CreateInstance mit Liste <T> wenn Deserialize json mit DataContractJsonSerializer

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

Die Klasse, die die Elemente repräsentiert ist:

[DataContract] 
public class MyClass 
{ 

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

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

     private DateTime _dtcreate; 
} 

Beachten Sie, dass in Der Standardkonstruktor von MyClass I legt einen Standardwert für "_dtcreate" fest.

Also, ich bin mit diesem Code json in ein Array von T Deserialize:

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

Wenn ich einen JSON-String deserialisieren ich nicht die Eigenschaft "_dtcreate" evalued in meinem entserialisierten Array gefunden.

Ich denke, DataContractJsonSerializer verwendet nicht den Standardkonstruktor von MyClass.

Kann ich die

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

eine Instanz für alle Objekte zu erstellen, um das Array „GTYPE“ Zugehörigkeit zu mir, dass alle Objekten meiner Liste machen gewährleisten deserialiced ​​mit dem dafault Konstruktor meiner T-Klasse erstellt ?

Vielen Dank!

+0

'DateTime' ist eine Struktur. Ihr Konstruktor ist völlig nutzlos. – SLaks

Antwort

1

DataContract-Serialisierer führen keine Konstruktoren aus.

Stattdessen sollten Sie Ihre Logik in an [OnDeserializing] method setzen.

+0

Danke! Ich setze dies._dtcreate = new DateTime(); in der OnDeserializedMethod und funktioniert gut .. –

+0

@Nicola: Sie müssen das überhaupt nicht tun. Da DateTime ein Werttyp ist, wird dieser automatisch auf den Standardwert gesetzt. Es kann nicht "null" sein. Sie suchen nach "DateTime.Now". – SLaks

+0

Die Eigenschaft "_dtcreate" ist nur ein Beispiel. Ich habe wirklich eine String-Eigenschaft mit einem Standardwert zu setzen. Danke für deine Unterstützung! –

Verwandte Themen