c# - 如何保存/加载到具有不可序列化属性的磁盘类?

标签 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 值?

最佳答案

我实际上没有在您的模型中看到任何“不可序列化”的东西(看起来任何主要模型都可以很好地工作 - 特别是 XmlSerializer、Json.NET 和 protobuf-net ,这是我通常的默认值);任何值得注意的序列化程序都不应在枚举或 DateTime 上阻塞。但是:如果某处确实有问题的类型,有两种方法可以做到这一点:

  1. 大多数序列化工具/库都支持某种“自定义序列化器”API,以备不时之需;这通常需要您学习方式太多关于底层序列化架构的知识(例如:IXmlSerializable.ReadXml - 这对于所有场景 100% 正确只是一场噩梦);我通常建议尝试这样做!
  2. 更简单:停止尝试序列化不能自然序列化的事物。当人们坚持要序列化他们的主要模型 时,通常会出现此问题,但是...这只是在以错误的方式解决问题:您最终与序列化程序作对。更简单和更易于维护的是构建一个看起来与您的主要模型相似的单独模型,但它纯粹是为了适应特定序列化程序的细微差别(如果您支持多种序列化格式或不同的序列化版本,在某些情况下您甚至可能需要多个模型)。所以:创建一些类似于您的模型的东西,但它只使用固有的可序列化类型——然后编写几行(通常非常简单的)代码来两者之间的映射模特。

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

关于c# - 如何保存/加载到具有不可序列化属性的磁盘类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54090641/

相关文章:

c# - 如何用管道分隔的字符串(不在双引号内

c# - 在 UWP 中找不到 ApplicationView

c# - UWP NavigationView 标题标题

c# - 如何从 XmlNode 实例获取 xpath

c# - 如何将应用程序从 xcode 部署到设备

c# - 使用 X-ALT-DESC/将 HTML 应用于 Outlook 中的日历邀请

jquery - 将函数应用于类或通过each() 之间的区别

java - 从类中调用计算变量

php - 如何将多个值传递给类?

windows - XAML 查看器提示更新 windows 1809,但我没有任何更新