2

[DataMember(IsRequired = false, EmitDefaultValue = false)] で装飾されたフィールドとプロパティを持つオブジェクトをシリアル化しようとしています。これらのオブジェクトを変更することはできません (ソース コードにアクセスできません)。すべてのフィールドをシリアル化し、値に関係なくプロパティ。NullValueHandling.Include を使用してみましたが、違いはありませんでした。これらのプロパティをシリアル化するように JSON.Net に指示できる別の設定はありますか?

これは非常に単純なサンプル クラスです (繰り返しますが、このクラスは変更できないことに注意してください)。

[Serializable]
[DataContract]
class SampleClass2
{
    public SampleClass2()
    {
        dow = daysOfWeek.Mon;
    }

    public enum daysOfWeek { Mon = 0, Tue = 1, Wed = 2, Thu = 3, Fri = 4, Sat = 5, Sun = 6 };

    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public daysOfWeek dow;
}

そして、それをシリアル化するために使用しているコード:

    public static void TestSerializeSampleClass2()
    {
        SampleClass2 sc2 = new SampleClass2();
        sc2.dow = SampleClass2.daysOfWeek.Mon;

        string json = "";

        Newtonsoft.Json.JsonSerializerSettings jss =
            new Newtonsoft.Json.JsonSerializerSettings() { DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include, NullValueHandling = Newtonsoft.Json.NullValueHandling.Include };
        // jss.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
        json = Newtonsoft.Json.JsonConvert.SerializeObject(sc2, jss);
        Console.WriteLine(json);


        sc2.dow = SampleClass2.daysOfWeek.Tue;
        json = Newtonsoft.Json.JsonConvert.SerializeObject(sc2, jss);
        Console.WriteLine(json);


        Console.WriteLine("");
        Console.ReadLine();
    }

これを実行した場合の出力:

{} {"ダウ":1}

ゼロ (0) は列挙型のデフォルトの C# 値であるため、「dow」が「Mon」に設定されている場合、シリアル化された JSON は空ですが、2 回目の試行では「Tue」を使用して値 1 を取得します。

私は独自の ContractResolver を作成するルートをたどり始めましたが、あきらめなければなりませんでした。元の「GetSerializableMembers」コードは、内部メソッドに対して多くの呼び出しを行うため、多くのコードを自分のプロジェクトにオーバーライド/コピーする必要がないようにしたいと考えています。どこかに欠けている設定があるかもしれないと思います。

どんな助けでも大歓迎です。

前もって感謝します、

グスタボ

4

1 に答える 1

0

DataContract サロゲートはここで機能しませんか?

http://msdn.microsoft.com/en-us/library/ms733064%28v=vs.110%29.aspx

必要なデコレータを使用して Surrogate クラスを作成できます (したがって、EmitDefaultValue=false は使用しません)。これは、初期クラス コード全体を複製する必要なく機能するはずです。

于 2014-04-09T08:30:31.790 に答える