.net – DateTime和xsd:Date的往返XML序列化?
好的,我在这里缺少什么? MSDN说以下关于DateTimeSerializationMode:
然而: namespace ConsoleApplication1 { public class DateSerTest { [XmlElement(DataType = "date")] public DateTime Date { get; set; } } class Program { static void Main(string[] args) { DateSerTest d = new DateSerTest { Date = DateTime.SpecifyKind(new DateTime(2009,8,18),DateTimeKind.Utc),}; XmlSerializer ser = new XmlSerializer(typeof(DateSerTest)); using (FileStream fs = new FileStream("out.xml",FileMode.Create)) { ser.Serialize(fs,d); } // out.xml will contain: // <Date>2009-08-18</Date> using (FileStream fs = new FileStream("out.xml",FileMode.Open)) { DateSerTest d1 = (DateSerTest) ser.Deserialize(fs); Console.WriteLine(d1.Date); // yields: 8/18/2009 12:00:00 AM Console.WriteLine(d1.Date.Kind); // yields: Unspecified } // in.xml: // <DateSerTest> // <Date>2009-08-18Z</Date> // </DateSerTest> using (FileStream fs = new FileStream("in.xml",FileMode.Open)) { DateSerTest d1 = (DateSerTest) ser.Deserialize(fs); Console.WriteLine(d1.Date); // yields: 8/17/2009 8:00:00 PM Console.WriteLine(d1.Date.Kind); // yields: Local using (FileStream fs1 = new FileStream("out2.xml",FileMode.Create)) { ser.Serialize(fs1,d1); // out2.xml will contain: // <Date>2009-08-17</Date> } } Console.ReadKey(); } } } 因此,对于定义为“date”而不是“dateTime”的XSD元素,日期不会以UTC序列化.这是一个问题,因为如果我反序列化这个XML,那么生成的日期将是“未指定的”类型,并且任何转换为??UTC(实际上应该是无效的,因为UTC的日期应该在往返期间被保留),将至少改变一天的时间,昨天有50%的机会提供日期,具体取决于您是否在格林威治的东部或西部. 日期不得写为: <Date>2009-08-18Z</Date> ? 实际上,如果我反序列化包含上述的文档,我会收到一个已经被转换为本地时间的DateTime(我在纽约,所以这是8月17日20:00),如果我立即将该对象序列化回XML,我得到: <Date>2009-08-17</Date> 所以,UTC被转换为本地的方式,而当地的一部分在出路的时候,这将使它在未来的路上重新出现.我们对8月18日原始UTC日期规格的了解不全面. 以下是W3C对xsd的说法:date:
根本的问题是,如果我做以下: >构造(或以其他方式接收)UTC DateTime值. 或以下: >对包含UTC xsd:date对象的XML文档进行反序列化(例如:2009-08-18Z). 这些程序中的任何一个应该让我和我放在一起的日期一样. 解决方法 到目前为止,我可以看到获得往返行为的唯一方法是实现Date属性如下,假设所有xsd:date元素都代表UTC: [XmlElement(DataType = "date")] public DateTime Date { get { return _dt; } set { _dt = value.Kind == DateTimeKind.Unspecified ? DateTime.SpecifyKind(value,DateTimeKind.Utc) : value.ToUniversalTime(); } }
我打开了一个Connect问题,从Microsoft回来,确认了我的恐惧:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- swift使用cocoapods导入oc三方库
- sqlite 如何建立自动增长字段
- ruby-on-rails – Zoho的Rails ActionMailer配置
- 将服务引用添加到引用了JSON.NET库的项目时出现奇怪的问题
- 查询依赖包
- Flex反射:通过调用getDefintionByName函数动态创建按钮等控
- ruby-on-rails – JSON字符串到rails hash
- c# – 在Parallel.ForEach中指定默认的MaxDegreeOfParallel
- c# – 如何使用OleDbDataAdapter从Excel文件中的任何电子表
- Cocos2d-x之简单数据存储 — Userdefault