2010-11-28 4 views
0

と逆シリアル化するJSONは、私は、このJSON文字列をデシリアライズしていたときに一覧 と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; 
    } 

私はevalued私の非直列化された配列プロパティ「_dtcreate」には見られないJSON文字列をデシリアライズするとき。

私は、DataContractJsonSerializerは、MyClassのデフォルトのコンストラクタを使用しないと思います。

私は私がdeserialiced私のリストのすべてのオブジェクトは、私のTクラスのdafaultのコンストラクタで作成されていることを確認するために、アレイ「GTYPE」に属するすべてのオブジェクトのインスタンスを作成するために

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

を使用することができます?

ありがとうございました!

+0

'DateTime'は構造体です。あなたのコンストラクタは完全に役に立たない。 – SLaks

答えて

1

DataContractシリアライザはコンストラクタを実行しません。

ロジックをan [OnDeserializing] methodに入れてください。

+0

ありがとう!私はthis._dtcreate = new DateTime()を設定しました。 OnDeserializedMethodで正常に動作します。 –

+0

@Nicola:あなたはまったくそれをする必要はありません。 DateTimeは値型なので、自動的にデフォルト値に設定されます。ヌルにすることはできません。あなたは 'DateTime.Now'を探しているかもしれません。 – SLaks

+0

"_dtcreate"プロパティは単なる例です。私は実際にはデフォルト値で設定する文字列プロパティを持っています。サポートありがとうございます! –