Обновление NewtonSoft JSON.NET без неявной сериализации защищенных элементов

Я только что обновил свою версию NewtonSoft JSON.NET с версии 3.0.0 до 3.5.0 и заметил, что защищенные элементы не сериализуются неявно.

У меня есть следующий класс:

public class SimpleFileContainer : IDto
{
    public virtual string Name { get; protected set; }

    public virtual string Path { get; protected set; }

    public SimpleFileContainer(string name, string path)
    {
        Name = name;
        Path = path;
    }
}

Следующий тестовый код не проходит

var json = JsonConvert.SerializeObject(new SimpleFileContainer("Name", "Path"));

var deserialised = JsonConvert.DeserializeObject<SimpleFileContainer >(json);

Assert.That(deserialised.Name, Is.EqualTo("Name");

оба свойства Name и Path имеют значение null, если только я не сделаю наборы свойств общедоступными или не добавлю обновление класса со следующими атрибутами:

[JsonObject(MemberSerialization.OptOut)]
public class SimpleFileContainer : IDto
{
    [JsonProperty]
    public virtual string Name { get; protected set; }

    [JsonProperty]
    public virtual string Path { get; protected set; }

    public SimpleFileContainer(string name, string path)
    {
        Name = name;
        Path = path;
    }
}

Это проект разумного размера, в котором много используется процесс сериализации, я не хочу проходить код, добавляя эти атрибуты к каждому классу и члену.

Есть ли способ обойти это?


person dagda1    schedule 22.06.2010    source источник


Ответы (1)


У меня была такая же проблема сегодня. К счастью, у Айенде было исправление, и я делюсь им с вами. При настройке сериализатора измените свойство DefaultMembersSearchFlags в ContractResolver:

var serializer = new JsonSerializer
                        {
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                            ContractResolver = new DefaultContractResolver
                                {
                                    DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
                                },
                            TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple,

                            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
                        };
person João Bragança    schedule 06.08.2010
comment
Эти настройки также сериализуют поля. Не только свойства. - person Kugel; 12.01.2013