如何使用不可序列化的属性保存/加载到磁盘类?

时间:2019-01-08 11:15:51

标签: c# class uwp save serializable

我有一个类,必须将其保存到磁盘,然后在每次应用初始化时加载。我不在乎创建的文件是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 :(得分:3)

我实际上没有在模型中看到任何“不可序列化”的东西(看起来任何主要的模型都可以正常工作-尤其是XmlSerializer,Json.NET和protobuf-net,它们是我通常的默认设置);注释的序列化程序不应阻塞枚举或DateTime。但是:如果某处确实存在 问题类型,则有两种方法可以实现:

  1. 大多数序列化工具/库都支持某种“自定义序列化器” API,以便在某些情况下无法立即使用。这通常需要您对基础序列化体系结构了解得太多(例如:IXmlSerializable.ReadXml-这是在所有情况下都能100%正确实现的噩梦);我通常不建议您尝试这样做!
  2. 简单得多:停止尝试序列化无法自然序列化的内容。当人们坚持要序列化他们的 primary模型时,通常会发生此问题,但是...这只是错误的处理方式:您最终要与序列化程序抗争。更简单,更易于维护的是,构建一个与主模型看上去相似的单独模型,但它纯粹是为了适应特定序列化程序的细微差别(如果您支持多种序列化格式或不同的序列化版本,在某些情况下甚至可能需要多个模型)。因此:创建类似于模型的 ,但仅利用固有的可序列化类型-然后编写几行(通常非常简单的)代码,以在两者之间映射模型。

在2的某些情况下,序列化工具甚至可能支持“代理”概念,这样,当它们变得笨拙时,您只需为 some 类型添加此模型-但可以使用主模型其他大多数事物的模型。例如,只要在两种类型之间的两个方向都存在转换操作(隐式或显式),protobuf-net便可以执行此操作-因此您可以使用Foo类型和FooSerialization类型类型看起来很像Foo,并且具有往返Foo的转换操作符,但是它“更简单”(因为需要更好的词)-使用明显的简单类型(例如,也许对图像使用byte[]而不是Image / Bitmap

答案 1 :(得分:0)

我建议使用newtonsoft.json。

您可以为DateTime和GeoPoint值编写json转换器,以使其保持所需的形式,然后在反序列化时将其转换回。

答案 2 :(得分:0)

在上面的谈话中回应Marc Gravell,我无法发布格式化的代码...

因此,如果我在Date_v01类中对DateTime进行了更改,则可以在给出问题的代码中看到它(也可以在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; }
    }

应该解决序列化问题,对吗?