2010-06-22 3 views
4

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

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

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"); 

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

[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; 
    } 
} 

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

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

ответ

7

У меня была такая же проблема сегодня. К счастью, Айенде исправился, и я делюсь с тобой. При настройке сериализатора измените свойство 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 
         }; 
+2

Эти настройки также сериализуют поля. Не только свойства. – Kugel

Смежные вопросы