我正在尝试序列化一个对象,该对象具有用[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”代码对内部方法进行了大量调用,我希望避免将这么多代码覆盖/复制到我自己的项目中。我相信可能会有一个我在某处失踪的环境。
非常感谢任何帮助。
提前致谢,
古斯塔沃
答案 0 :(得分:0)
DataContract Surrogates不能在这里工作吗?
http://msdn.microsoft.com/en-us/library/ms733064%28v=vs.110%29.aspx
你可以用你想要的任何装饰器创建一个Surrogate类(所以没有EmitDefaultValue = false),这应该可以工作,而不需要复制整个初始类代码。