Json.net serializa un campo privado específico

Tengo la siguiente clase:

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

Mi objective es serializar solo el campo _hexes , así que creé el siguiente ContractResolver:

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

y cuando quiero serializar una instancia de TriGrid, lo hago:

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

pero cuando compruebo el valor de strintJson siempre es "{}" . El _hexes tiene elementos, no está vacío. Si serializo un HexTile particular, funciona como se esperaba. ¿Qué estoy haciendo mal aquí?

No es necesario implementar un DefaultContractResolver personalizado. La solución es poner [JsonProperty] en _hexes y [JsonIgnore] en todas las demás propiedades y campos.

Debido a que los modelos comerciales eventualmente cambiarán, prefiero implementar ISerializable y usar la forma de creación de momentos de .NET (es decir, una bolsa de propiedades). Esto funciona mejor cuando necesita versionar sus objetos en tiempo de ejecución. Cualquier cosa que no desee serializar, no la ponga en el bolso de la propiedad.

Especialmente, ya que JSON.Net (Newtonsoft.Json) también lo honrará con sus métodos de serialización y deserialización.

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