1. 程式人生 > 實用技巧 >JavaScriptSerializer之DateTime序列化

JavaScriptSerializer之DateTime序列化

​ ECMAScript 第五版(15.9.5.4)指導toJSON方法的實現應該把一個Date物件處理成UTC時間的ISO 8601格式字串,例如:"2011-12-28T08:20:31.917Z",這是一個比較通用的一個格式,同時當需要轉回Date物件時可以直接將該字串傳給Date構造器,例如:new Date("2011-12-28T08:20:31.917Z")

​ .NET的JavaScriptSerialzer轉化出來的字串類似"/Date(1600237540407)/",這種形式降低了可操作性性,雖然提供了擴充套件點,但只允許你從一個物件轉換成為另外一個物件,而不能轉換為自定義的字串.藉助繼承Uri實現 IDictionary<string, object>來進行Hack.

Hack Code

public class DateTimeJavaScriptConverter : JavaScriptConverter
{
	public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
	{
		return new JavaScriptSerializer().ConvertToType(dictionary, type);
	}
	
	public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
	{
		if (!(obj is DateTime)) return null;
		return new CustomString(((DateTime)obj).ToUniversalTime().ToString("O"));
	}
	
	public override IEnumerable<Type> SupportedTypes
	{
	  get { return new[] { typeof(DateTime) }; }
	}
	
	private class CustomString : Uri, IDictionary<string, object>
	{
		public CustomString(string str)
		  : base(str, UriKind.Relative)
		{
		}
		
		void IDictionary<string, object>.Add(string key, object value)
		{
			throw new NotImplementedException();
		}
		
		bool IDictionary<string, object>.ContainsKey(string key)
		{
			throw new NotImplementedException();
		}
		
		ICollection<string> IDictionary<string, object>.Keys
		{
			get { throw new NotImplementedException(); }
		}
		
		bool IDictionary<string, object>.Remove(string key)
		{
			throw new NotImplementedException();
		}
		
		bool IDictionary<string, object>.TryGetValue(string key, out object value)
		{
			throw new NotImplementedException();
		}
		
		ICollection<object> IDictionary<string, object>.Values
		{
			get { throw new NotImplementedException(); }
		}
		
		object IDictionary<string, object>.this[string key]
		{
			get
			{
			  throw new NotImplementedException();
			}
			set
			{
				throw new NotImplementedException();
			}
		}
		
		void ICollection<KeyValuePair<string, object>>.Add(KeyValuePair<string, object> item)
		{
		  throw new NotImplementedException();
		}
		
		void ICollection<KeyValuePair<string, object>>.Clear()
		{
		  throw new NotImplementedException();
		}
		
		bool ICollection<KeyValuePair<string, object>>.Contains(KeyValuePair<string, object> item)
		{
		  throw new NotImplementedException();
		}
		
		void ICollection<KeyValuePair<string, object>>.CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
		{
		  throw new NotImplementedException();
		}
		
		int ICollection<KeyValuePair<string, object>>.Count
		{
		  get { throw new NotImplementedException(); }
		}
		
		bool ICollection<KeyValuePair<string, object>>.IsReadOnly
		{
		  get { throw new NotImplementedException(); }
		}
		
		bool ICollection<KeyValuePair<string, object>>.Remove(KeyValuePair<string, object> item)
		{
		  throw new NotImplementedException();
		}
		
		IEnumerator<KeyValuePair<string, object>> IEnumerable<KeyValuePair<string, object>>.GetEnumerator()
		{
		  throw new NotImplementedException();
		}
		
		IEnumerator IEnumerable.GetEnumerator()
		{
		  throw new NotImplementedException();
		}
	}
}