Json.net сериализует определенное частное поле

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

public class TriGrid { private List _hexes; //other private fields... //other public proprerties } 

Моя цель – сериализовать только поле _hexes , поэтому я создал следующий ContractResolver:

 internal class TriGridContractResolver : DefaultContractResolver { protected override List GetSerializableMembers(Type objectType) { return new List { objectType.GetMember("_hexes", BindingFlags.NonPublic | BindingFlags.Instance)[0] }; } } 

и когда я хочу сериализовать экземпляр TriGrid, я делаю:

  var settings = new JsonSerializerSettings() { ContractResolver = new TriGridContractResolver() }; var json = JsonConvert.SerializeObject(someTriGrid, settings); string strintJson = json.ToString(); 

но когда я проверяю значение strintJson , всегда "{}" . У _hexes есть элементы, они не пустые. Если я сериализую один конкретный HexTile он работает так, как ожидалось. Что я здесь делаю неправильно?

Нет необходимости реализовывать пользовательский DefaultContractResolver . Решение состоит в том, чтобы поместить [JsonProperty] в _hexes и [JsonIgnore] во все остальные свойства и поля.

Поскольку бизнес-модели в конечном итоге меняются, я предпочитаю внедрять ISerializable и использовать способ .NET для создания импульсов (т. Е. Мешок для имущества). Это лучше всего работает, когда вам нужно обновлять объекты во время выполнения. Все, что вы не хотите сериализовать, не помещайте в сумку свойств.

Тем более, что JSON.Net (Newtonsoft.Json) также будет соблюдать его с помощью методов сериализации и десериализации.

 using System; using System.Runtime.Serialization; [Serializable] public class Visitor : ISerializable { private int Version; public string Name { get; private set; } public string IP { get; set: } public Visitor() { this.Version = 2; } public void ChangeName(string Name) { this.Name = Name; } //Deserialize protected Visitor(SerializationInfo info, StreamingContext context) { this.Version = info.GetInt32("Version"); this.Name = info.GetString("Name"); } //Serialize public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("Version", this.Version); info.AddValue("Name", this.Name); } [OnDeserialized] private void OnDeserialization(StreamingContext context) { switch (this.Version) { case 1: //Handle versioning issues, if this //deserialized version is one, so that //it can play well once it's serialized as //version two. break; } } } 
  • «Тип не ожидается», используя DataContractSerializer - но это просто class, не смешные вещи?
  • Сериализовать статический class?
  • Сериализация нулевого значения в JSON.NET
  • C # JSON.NET - десериализация ответа, использующего необычную структуру данных
  • jackson - Как обрабатывать (десериализовать) вложенный JSON?
  • Получение ServiceStack для сохранения информации о типе
  • Json.NET: десериализация вложенных словарей
  • jackson не десериализует общий список, который он сериализовал
  • Каковы различия между XmlSerializer и BinaryFormatter
  • Сериализация OpenCV Mat_
  • Django rest framework, используйте разные сериализаторы в том же ModelViewSet
  • Interesting Posts
    Давайте будем гением компьютера.