Как использовать Activator.CreateInstance со списком <T>при десериализации json с помощью DataContractJsonSerializer - PullRequest
0 голосов
/ 28 ноября 2010

Я десериализую эту строку 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".

Итак, я использую этот код для десериализации 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", оцененное.

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

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

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

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

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

1 Ответ

1 голос
/ 28 ноября 2010

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

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

...