我有一个类,必须将其保存到磁盘,然后在每次应用初始化时加载。我不在乎创建的文件是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值?
答案 0 :(得分:3)
我实际上没有在模型中看到任何“不可序列化”的东西(看起来任何主要的模型都可以正常工作-尤其是XmlSerializer
,Json.NET和protobuf-net,它们是我通常的默认设置);注释的序列化程序不应阻塞枚举或DateTime
。但是:如果某处确实存在 问题类型,则有两种方法可以实现:
IXmlSerializable.ReadXml
-这是在所有情况下都能100%正确实现的噩梦);我通常不建议您尝试这样做!在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; }
}
应该解决序列化问题,对吗?