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, я делаю:
- Джерси + jackson JSON формат даты формат - как изменить формат или использовать пользовательские JacksonJsonProvider
- Рекомендации по сериализации DateTime в .NET 3.5
- jQuery serializeArray не включает кнопку отправки, которая была нажата
- Как вы сериализуете объект на C ++?
- Как вы делаете глубокую копию объекта в .NET (например, C #)?
var settings = new JsonSerializerSettings() { ContractResolver = new TriGridContractResolver() }; var json = JsonConvert.SerializeObject(someTriGrid, settings); string strintJson = json.ToString();
но когда я проверяю значение strintJson
, всегда "{}"
. У _hexes
есть элементы, они не пустые. Если я сериализую один конкретный HexTile
он работает так, как ожидалось. Что я здесь делаю неправильно?
- Невозможно десериализовать lambda
- XSLT: как преобразовать XML-узел в строку
- Использование JSON.NET для возврата ActionResult
- Сериализация с Qt
- Стандартный способ сериализации JSON для строки запроса?
- Deserialize JSON в динамический объект C #?
- Есть ли у .NET 4 встроенный сериализатор / десериализатор JSON?
- Серийный цикл ActiveRecord с использованием JSON вместо YAML
Нет необходимости реализовывать пользовательский 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; } } }