前幾天公司內部開發,直接使用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在序列化的時候出現的時間格式的問題。
如果有遇到同樣問題,有比這個更好的解決辦法的;歡迎拍磚留言。

