我有一个新的DateTimeEx类型,它具有DateTime类型的属性。我需要让JavaScriptSerializer将DateTimeEx类型与DateTime完全一样,在序列化它时得到类似 \“\ / Date(1431006511857)\ / \”的内容,就像在DateTime类型上调用Serialize一样
我已经实现了自己的JavaScriptConverter,它使用了this文章中的CustomString:Uri技巧。
我执行以下操作来构建新字符串。
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) {
DateTimeEx dateTimeEx = (DateTimeEx)obj;
DateTime dateTime = dateTimeEx.GetDateTimeComponent();
StringBuilder sb = new StringBuilder();
sb.Append("\"\\/Date(");
var dtVal = (dateTime.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 10000L;
sb.Append(dtVal);
sb.Append(")\\/\"");
return new CustomString(sb.ToString());
}
但是由于在JavaScriptSerializer类中调用Uri如下所示:
private static void SerializeUri(Uri uri, StringBuilder sb)
{
sb.Append("\"").Append(uri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped)).Append("\"");
}
我获得了一个转义字符串“\”%22%5C /日期(1431010958974)%5C /%22 \“”而不是 \“\ /日期(1431006511857)\ / \“
关于如何克服这个问题的任何想法?
答案 0 :(得分:0)
您可能需要查看Data Contract Surrogates。这将允许您在序列化期间将DateTimeEx替换为实际的DateTime。我使用它来替换我在C#中喜欢的大写(Pascal case)属性名称,用于JavaScript中的较低(驼峰)案例名称。
它实际上只是一个接口(IDataContractSurrogate),你可能只实现了几个方法。这会传递给序列化程序的构造函数。或者,在WCF中,它可以作为操作行为添加(链接中的示例)。
如果没有进一步的细节,我无法确定这是否适合您的特定情况。