Как сохранить / загрузить на диск класс с не сериализуемыми свойствами? - PullRequest
0 голосов
/ 08 января 2019

У меня есть класс, который необходимо сохранить на диск, а затем загружать при каждой инициализации приложения. Мне все равно, является ли созданный файл JSON, XML или двоичный файл. Это класс:

    public class PhotoSpot_v01
    {
        public int      ID { get; set; }
        public string   Title { get; set; }
        public string   Description { get; set; }
        public int      Rating { get; set; }
        public bool     Reminder { get; set; }
        public bool     Toast { get; set; }

        private double   Latitude { get; set; }
        private double   Longitude { get; set; }
        private double   Altitude { get; set; }

        public GoogleMapsAPI.TimeZone TimeZone { get; set; }

        public globalVars.Tags MainTag { get; set; }

        public version Version { get; set; }

        public Milestone_v01    Milestone { get; set; }
        public List<Image_v01>  Images { get; set; }
        public List<URL_v01>    URLs { get; set; }
        public List<globalVars.Tag>    Tags { get; set; }
        public List<Date_v01>   Dates { get; set; }}

А вот, классы и перечисления, ... используемые в основном классе:

    public class Milestone_v01
    {
        public bool     freeMilestone { get; set; }
        public string   Title { get; set; }
        public double   Latitude { get; set; }
        public double   Longitude { get; set; }
        public double   Altitude { get; set; }
        public globalVars.Astro Astro { get; set; }
    }

    public enum Astro
    {
        Sun, Moon, Night, Any
    }


    public class Image_v01
    {
        public string imageURI { get; set; }
        public bool   isDownloaded { get; set; }
    }

    public class URL_v01
    {
        public string sURL { get; set; }
    }

    public class Tag_v01
    {
        public globalVars.Tags TagName { get; set; }
    }

    public class Date_v01
    {
        public DateTime DateStart { get; set; }
        public DateTime DateEnd { get; set; }
    }

Как мне удается сохранить значения перечисления и особенно значения DateTime и Geopoint?

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Я бы предложил использовать newtonsoft.json.

Вы можете написать json converter для значений DateTime и GeoPoint, чтобы сохранить их в нужной форме, а затем преобразовать их обратно при десериализации.

0 голосов
/ 08 января 2019

Отвечая Марку Грэйвеллу в приведенном выше разговоре, я не могу опубликовать отформатированный код ...

Итак, если я внесу это изменение в DateTime в классе Date_v01, это будет видно в коде, заданном в вопросе (и в дополнение к Geopoint):

    public class Date_v01
    {

        public double DateStart;
        public double DateEnd;

        public DateTime DateTimeStart()
        {
            return CoreTime.JD2DateTime(DateStart);
        }

        public DateTime DateTimeEnd()
        {
            return CoreTime.JD2DateTime(DateEnd);
        }

        //public DateTime DateStart { get; set; }
        //public DateTime DateEnd { get; set; }
    }

проблема с сериализацией должна быть решена, верно?

0 голосов
/ 08 января 2019

Я на самом деле не вижу ничего "не сериализуемого" в вашей модели (похоже, что с любым из них все будет работать нормально - особенно XmlSerializer, Json.NET и protobuf-net, которые являются моими обычными по умолчанию); никакой сериализатор примечаний не должен подавиться перечислениями или DateTime. Но: если действительно является проблемным типом где-то, есть два способа сделать это:

  1. большинство инструментов / библиотек сериализации поддерживают какой-то API "пользовательского сериализатора", когда что-то не работает из коробки; обычно для этого требуется, чтобы вы way слишком много узнали о базовой архитектуре сериализации (пример: IXmlSerializable.ReadXml - это просто кошмар, чтобы получить 100% правильность для всех сценариев); Я не обычно рекомендую попробовать это сделать!
  2. намного проще: перестаньте пытаться сериализовать вещи, которые не сериализуются естественным образом . Эта проблема обычно возникает, когда люди настаивают на том, что они хотят сериализовать свою основную модель , но ... все происходит иначе: вы в конечном итоге сражаетесь с сериализатором. Гораздо проще и удобнее в обслуживании является создание отдельной модели, которая выглядит похожей на вашу основную модель, но которая предназначена исключительно для соответствия нюансам конкретного сериализатора (если вы поддерживаете несколько форматов сериализации или разные версии сериализации, вам может даже понадобиться несколько моделей в некоторых случаях). Итак: создайте как вашу модель, но в которой используются только сериализуемые типы, а затем напишите несколько строк (обычно очень простого) кода, который отображает между двумя моделями.

В некоторых случаях 2, инструмент сериализации может даже поддерживать «суррогатную» концепцию, так что вам нужно добавить эту модель только для некоторых типов, когда они становятся неудобными - но могут использовать основную модель для большинства других вещей. Например, protobuf-net позволяет вам делать это до тех пор, пока есть операция преобразования (явная или неявная) в обоих направлениях между двумя типами, так что вы можете иметь тип Foo и тип FooSerialization, который выглядит как очень похож на Foo, и имеет операторы преобразования в / из Foo, но что «проще» (из-за отсутствия лучшего слова) - использование очевидных простых типов (например, возможно использование byte[] вместо Image / Bitmap для изображений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...