Как сериализовать неизменяемую структуру - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь сериализовать неизменную структуру, используя JSon.NET, и я не знаю, как это сделать. Результатом сериализации является пустой json {}. Я бы предпочел использовать JsonNET, а не что-то тяжелое, например BinaryFormatter.

Struct

[Serializable]
    public struct Settings : IEquatable<Settings> {

        private readonly (
            TimeSpan from,
            TimeSpan until,
            TimeSpan repeatInterval,
            TimeSpan popupInterval,
            string notes
        ) _value;

        [JsonIgnore]
        public TimeSpan From => _value.from;
        [JsonIgnore]
        public TimeSpan Until => _value.until;
        [JsonIgnore]
        public TimeSpan Repeat => _value.repeatInterval;
        [JsonIgnore]
        public TimeSpan PopUpInterval => _value.popupInterval;
        [JsonIgnore]
        public string Notes => _value.notes;



        public Settings(
            TimeSpan from,
            TimeSpan until,
            TimeSpan repeatInterval,
            TimeSpan popUpInterval,
            string notes
        ) => _value = (
            from,
            until,
            repeatInterval,
            popUpInterval,
            notes
        );

        public bool Equals(Settings other) => _value == other._value;
        public override bool Equals(object obj) => obj is Settings other && this.Equals(other);
        public override int GetHashCode() => _value.GetHashCode();
        public override string ToString() => _value.ToString();



        public static bool operator ==(Settings a, Settings b) => a.Equals(b);
        public static bool operator !=(Settings a, Settings b) => !(a == b);
    }

Программа

static void Main(string[] args) {
            Settings settings = new Settings(new TimeSpan(0),
                new TimeSpan(0,1,1),
                new TimeSpan(1,2,3),
                new TimeSpan(2,4,3),
                "adisor");
            var obj = JsonConvert.SerializeObject(settings);
            var newone = JsonConvert.DeserializeObject<Settings>(obj);
        }

1 Ответ

1 голос
/ 22 мая 2019

Для сериализации атрибут JsonIgnore необходимо удалить из целевых свойств. Для десериализации конструктор, который будет использоваться во время десериализации, должен быть помечен атрибутом JsonConstruct. При желании имена сериализации (свойства) должны быть согласованы с именами десериализации (здесь параметры конструктора) через JsonProperty атрибуты.

    public TimeSpan From => _value.from;

    public TimeSpan Until => _value.until;

    public TimeSpan Repeat => _value.repeatInterval;

    public TimeSpan PopUpInterval => _value.popupInterval;

    public string Notes => _value.notes;

    [JsonConstructor] //choose a constructor for deserialization
    public Settings(
        TimeSpan from,
        TimeSpan until,
        [JsonProperty("Repeat")]TimeSpan repeatInterval, //same name used for serialization
        TimeSpan popUpInterval,
        string notes
    ) => _value = (
        from,
        until,
        repeatInterval,
        popUpInterval,
        notes
    );
...