Стратегия кэширования JSON.NET мешает моему циклу разработки? - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь добавить поле в существующий контракт данных в нашей системе. (Сначала код EF, POCO с атрибутом ад: P)

Однако при сериализации контракта в виде бритвы (для добавления в модель Angular.js) сериализатор пропускает новое поле. Если я перехожу в режиме отладки, объект Model в представлении содержит поле, но после того, как я использую JsonConverter.SerializeObject(Model), модель вывода не включает новое поле.

Я переработал приложение, перезапустил веб-сайт и перезапустил IIS без разрешения. Я также проверил поток данных с помощью fiddler, чтобы избежать проблем с кэшированием на стороне браузера.

Следующий обходной путь действительно работает, поэтому свойство существует в модели:

    var model = @Html.ToJson(Model);
    model.NewProperty = @Model.NewProperty;
    return {
        model: model
    };

... где Html.ToJson(Model) - это метод расширения, который просто вызывает JsonConvert.SerializeObject(Model) и вставляет его в MvcHtmlString.

Кто-нибудь знает, что происходит? Согласно этому ответу в json.net существует некоторая форма кэширования информации о типах, но больше информации о ней найти сложно.

1 Ответ

0 голосов
/ 05 ноября 2018

Я пытаюсь добавить поле в существующий контракт данных в нашей системе. Json.NET поддерживает контракты данных , а сериализация контрактов данных opt-in

Применение атрибута DataContractAttribute к типам (классам, структурам или перечислениям), которые используются в операциях сериализации и десериализации DataContractSerializer ...

Вы также должны применить DataMemberAttribute к любому полю, свойству или событию, содержащему значения, которые вы хотите сериализовать. Применяя DataContractAttribute, вы явно разрешаете DataContractSerializer для сериализации и десериализации данных.

Таким образом, если ваша модель помечена [DataContract], то вам необходимо пометить нового члена [DataMember]:

[DataContract]
public class Model : SomeBaseClass
{
    [DataMember]
    public string NewProperty;
}

Обратите внимание, что даже если ваш Model класс не помечен [DataContract], Json.NET по-прежнему требует, чтобы сериализуемые члены отмечались [DataMember] , пока какой-то базовый класс Model помечен с [DataContract]. Подробнее см. проблема сериализации caliburn.micro при реализации PropertyChangedBase .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...