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



我有一个类,它必须保存到磁盘上,然后在每次初始化应用程序时加载。我不在乎创建的文件是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,它们是我通常的默认值);任何值得注意的串行器都不应该阻塞enums或DateTime。但是:如果真的有有问题的类型,有两种方法:

  1. 大多数序列化工具/库都支持某种"自定义序列化器"API,以防某些东西无法开箱即用;这通常需要您学习方式太多关于底层序列化体系结构的知识(例如:IXmlSerializable.ReadXml——这只是一场噩梦,无法100%适用于所有场景);我通常建议尝试这样做
  2. 简单得多:停止尝试序列化那些不可自然序列化的东西。当人们坚持要序列化他们的主模型时,通常会出现这个问题,但是。。。这只是错误的做法:你最终会与序列化程序发生冲突。更简单、更可维护的是构建一个单独的模型,该模型看起来与主模型类似,但纯粹是为了适应特定序列化程序的细微差别(如果您支持多种序列化格式或不同的序列化版本,在某些情况下甚至可能需要多个模型)。因此:创建一些类似的模型,但只使用固有的可序列化类型,然后编写几行(通常非常简单)代码,在这两个模型之间映射

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

我建议使用newtonsoft.json.

您可以为DateTime和GeoPoint值编写json转换器,使它们保持您想要的形式,然后在反序列化时将它们翻译回。

在上面的对话中回应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; }
}

序列化问题应该得到解决,对吧?

最新更新