使用JavaScriptSerializer序列化我的DateTimeEx类型,使其行为与DateTime相同

时间:2015-05-07 15:10:27

标签: c# json javascriptserializer

我有一个新的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)\ / \“

关于如何克服这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

您可能需要查看Data Contract Surrogates。这将允许您在序列化期间将DateTimeEx替换为实际的DateTime。我使用它来替换我在C#中喜欢的大写(Pascal case)属性名称,用于JavaScript中的较低(驼峰)案例名称。

它实际上只是一个接口(IDataContractSurrogate),你可能只实现了几个方法。这会传递给序列化程序的构造函数。或者,在WCF中,它可以作为操作行为添加(链接中的示例)。

如果没有进一步的细节,我无法确定这是否适合您的特定情况。