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; } } } 
  • Преобразование записей в последовательную форму данных для отправки по HTTP
  • Deserialize специфическое перечисление в system.enum в Json.Net
  • Как превратить объект C # в строку JSON в .NET?
  • Избегайте сериализации jacksonа на непривлекательных ленивых объектах
  • Может ли JavaScriptSerializer исключать свойства с нулевыми значениями / значениями по умолчанию?
  • Как сериализовать Java-примитивы с помощью Jersey REST
  • Можно ли выполнять бинарную сериализацию .NET в случае, если у вас нет исходного кода classа?
  • Сериализация jacksonа JSON, предотrotation рекурсии путем определения уровня
  • Как настроить сериализацию списка объектов JAXB для JSON?
  • Преобразование байтов в Int / uint в C
  • Как вы сериализуете объект на C ++?
  • Давайте будем гением компьютера.