前几天公司内部开发,直接使用ADO的Adapter读取的数据,没有指定数据类型。遇到了一个使用publish发布消息之后,subscribe到的消息出现类型转换的问题,调试后发现是RabbitMQ在序列化DataTable数据的时候,将时间格式序列化成UTC时间了,这样一来,之前的代码就没用了。所以出现一个解决方案,这是目前我们用到的解决方案,可能还有其他更方便更简洁的。下面是我使用的解决方案:publish出去的json无数据类型,那么有的时间格式序列化的正常,有的则被序列化成了UTC时间。现在我使用了一个xml来传输数据,在将数据序列化成xml传输的时候也出现了数据格式的问题,还是某些时间格式被序列化成了UTC时间。
这个时候就要考虑几个问题:json是无数据类型的,传输的时候出现了问题;而xml传输也是没有指定数据类型才造成这个问题的;如果我指定数据类型会怎么样?于是使用几行代码来实现:
public string WriteXml(DataTable dt) { using (StringWriter sw = new StringWriter()) { dt.WriteXml(sw); return sw.ToString(); } }
public string WriteXmlSchema(DataTable dt) { using (StringWriter sw = new StringWriter()) { dt.WriteXmlSchema(sw); return sw.ToString(); } }
于是在将数据序列化成xml的时候,也顺便将数据的数据类型序列化成xml,这样publish过去的就是:数据的xml和数据类型的xml两个数据;在Consume的时候,将两个数据进行合并:
public DataTable XmlToDataTable(string xml, string xmlSchema ) { DataTable dt = new DataTable(); dt.ReadXml(xml); dt.ReadXmlSchema(xmlSchema); return dt; }
目前就是用这种方式解决了传输的DataTable在序列化的时候出现的时间格式的问题。
如果有遇到同样问题,有比这个更好的解决办法的;欢迎拍砖留言。