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 为空,而在第二次尝试时,使用“Tue”我得到的值为 1。

我开始通过编写自己的 ContractResolver 的路线,不得不放弃。原始的“GetSerializableMembers”代码对内部方法进行了大量调用,我希望避免将这么多代码覆盖/复制到我自己的项目中。我相信我可能在某处缺少一个设置。

任何帮助将不胜感激。

提前致谢,

古斯塔沃

4

1 回答 1

0

DataContract 代理不能在这里工作吗?

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

您可以使用您想要的任何装饰器创建一个代理类(因此没有 EmitDefaultValue=false),这应该可以在不需要复制整个初始类代码的情况下工作。

于 2014-04-09T08:30:31.790 回答