我有一个类必须保存到磁盘,然后在每次初始化应用程序时加载。我不关心创建的文件是 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
上阻塞。但是:如果某处确实有问题的类型,有两种方法可以做到这一点:
- 大多数序列化工具/库都支持某种“自定义序列化器”API,以备不时之需;这通常需要您学习方式太多关于底层序列化架构的知识(例如:
IXmlSerializable.ReadXml
- 这对于所有场景 100% 正确只是一场噩梦);我不通常建议尝试这样做! - 更简单:停止尝试序列化不能自然序列化的事物。当人们坚持要序列化他们的主要模型 时,通常会出现此问题,但是...这只是在以错误的方式解决问题:您最终与序列化程序作对。更简单和更易于维护的是构建一个看起来与您的主要模型相似的单独模型,但它纯粹是为了适应特定序列化程序的细微差别(如果您支持多种序列化格式或不同的序列化版本,在某些情况下您甚至可能需要多个模型)。所以:创建一些类似于您的模型的东西,但它只使用固有的可序列化类型——然后编写几行(通常非常简单的)代码来两者之间的映射模特。
在 2 的某些情况下,序列化工具甚至可能支持“代理”概念,这样您只需要为某些类型添加此模型,当它们变得笨拙时 - 但可以使用主要大多数其他事物的模型。例如,protobuf-net 允许您执行此操作,只要在两种类型之间存在双向转换操作(隐式或显式)——因此您可以拥有一个 Foo
类型和一个 FooSerialization
类型,它看起来很像 Foo
,并且具有到/从 Foo
的转换运算符,但它“更简单”(需要一个更好的词) - 使用明显的简单类型(例如,可能使用 byte[]
而不是 Image
/Bitmap
图像)。
关于c# - 如何保存/加载到具有不可序列化属性的磁盘类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54090641/