Почему JavaScriptSerializer десериализует свойство до значения по умолчанию или null

#c# #asp.net #serialization #deserialization #json-deserialization

#c# #asp.net #сериализация #десериализация #json-десериализация

Вопрос:

Я использую JavaScriptSerializer для сериализации и десериализации свойств в моем объекте. Во время сериализации все работает нормально. Однако немногие свойства сериализуются до значений по умолчанию вместо фактического значения, присвоенного им.

Это мой класс

 [Serializable]
public Class SimpleClass
{
    //This property is serialized properly
    //But always de-serialized to null
    [DefaultValue("null")]
    public List<string> Collection { get; }    
}
  

Это код, используемый для сериализации и десериализации

     SimpleClass testObject =new SimpleClass();
    testObject.Collection.Add("One");
    testObject.Collection.Add("Two");
    testObject.Collection.Add("Three");
    testObject.Collection.Add("Four");
    testObject.Collection.Add("Five");

    //Serializing the above object
    string serializedString = new JavaScriptSerializer().Serialize(testObject);

    //Deserializing the serialized string
    testObject = new JavaScriptSerializer().Deserialize<SimpleClass>(serializedString);
  

Однако после десериализации значение testObject.Collection свойства всегда равно null

Комментарии:

1. Можете ли вы показать определение класса и строку JSON и указать, какие свойства не заполняются?

2. @Anand вы можете начать с форматирования вашего вопроса и публикации короткого, автономного, правильного (компилируемого) примера

Ответ №1:

Любое свойство без параметра setter всегда десериализуется до значения по умолчанию.

JavaScriptSerializer внутренне использует отражение для сериализации и десериализации объекта. Если параметр setter отсутствует в свойстве, то сериализатор не может изменить значение этого свойства. Таким образом, оно будет инициализировано значением по умолчанию.

В приведенном выше коде у коллекции свойств нет значения по умолчанию, поэтому во время десериализации ему присваивается значение null.