1

DataTime をシリアル化するための RegisterConverters クラスを持つ JavaScriptSerializer があります。同じクラスに、DeserializeをスローするメソッドがありNotImplementedExceptionます。 RegisterConvertersオブジェクトをシリアライズするとき、クラスは正常に動作しています。

同じJavaScriptSerializerオブジェクトを使用して Json オブジェクトをデシリアライズし、必要な Class オブジェクトに戻すと、 がスローされNotImplementedExceptionます。

ここでは、クラスDeserilizeのメソッドを使用したくありません。RegisterConvertersどうすればそれを達成できますか?逆シリアル化するとき に何もない新しいJavaScriptSerializerオブジェクトとして機能します。RegisterConverters

public class DefaultNullPropertiesConverter : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        var jsonExample = new Dictionary<string, object>();
        foreach (var prop in obj.GetType().GetProperties())
        {
            //check if decorated with ScriptIgnore attribute
            bool ignoreProp = prop.IsDefined(typeof(ScriptIgnoreAttribute), true);

            var value = prop.GetValue(obj, BindingFlags.Public, null, null, null);
            if (value != null && !ignoreProp)
            {
                if (value.GetType().FullName == "System.DateTime" && Convert.ToDateTime(value) == DateTime.MinValue)
                    continue;
                else if (value.GetType().FullName == "System.DateTime")
                    jsonExample.Add(prop.Name, Convert.ToDateTime(value).ToString("yyyy-MM-dd"));
                else
                    jsonExample.Add(prop.Name, value);
            }
        }

        return jsonExample;
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get { return GetType().Assembly.GetTypes(); }
    }

}

Deserialize メソッドを呼び出すと、次のようになります。

var restGeoCodeResponse rgcr = jss.Deserialize<restGeoCodeResponse>(result); 

これは DefaultNullPropertiesConverter クラスの Deserialize メソッドを呼び出すべきではありません。RegisterConverts がないため、デシリアライズするだけです。

4

1 に答える 1

0

最初の質問は、RegisterConverters メソッドに何を渡しているのかということです。DateTime シリアライゼーションとデシリアライゼーションを処理する独自の JavascriptConverter を作成しましたか。その場合、作成した JavascriptConverter クラスの Deserialize メソッドに NotImplementedException がスローされている可能性があります。

サード パーティの JavascriptConverter を使用している場合は、そのソース コードを調べます。ソース コードがない場合は、JetBrains の dotPeek やTelerikJustDecompileなどのツールを使用してソースを逆コンパイルします。

于 2013-03-26T07:11:42.680 に答える