https://www.itsvse.com/forum.php?mod=viewthread&tid=4808
|
Newtonsoft.Json 大家应该都知道,常用的json序列化和反序列化工具
DataContractAttribute 指定该类型要定义或实现一个数据协定,并可由序列化程序(如 DataContractSerializer)进行序列化。 若要使其类型可序列化,类型作者必须为其类型定义数据协定。
遇到一个难题,父类有[DataContract]特性,子类继承父类,子类所有的属性都需要加上[DataMember]特性,才能序列化和反序列化,由于父类是别人封装的dll,所以,无法删除父类的[DataContract]特性!
测试如下,Test1类有[DataContract]特性,如果属性不加[DataMember]特性,会导致序列化和反序列化失败,如下图:
<ignore_js_op>
我们注释掉Test1类的[DataContract]特性,发现能正常序列化和反序列化,如下:
<ignore_js_op>
Newtonsoft.Json有没有什么高级的用法,可以忽略此特性呢?答案是有的!
只需使用Json.Net的OptOut属性即可。它将优先于DataContract。
- [JsonObject(MemberSerialization.OptOut)]
复制代码
// //摘要: //所有公共成员都默认序列化。成员可以使用Newtonsoft.Json.JsonIgnoreAttribute排除 //或System.NonSerializedAttribute。这是默认的成员序列化模式。 OptOut = 0, // //摘要: //只有标有Newtonsoft.Json.JsonPropertyAttribute或System.Runtime.Serialization.DataMemberAttribute的成员 //被序列化。此成员序列化模式也可以通过标记来设置 / /类与System.Runtime.Serialization.DataContractAttribute。 OptIn = 1, // //摘要: //所有公共和私人字段都被序列化。成员可以使用Newtonsoft.Json.JsonIgnoreAttribute排除 //或System.NonSerializedAttribute。这个成员序列化模式也可以 //通过用System.SerializableAttribute标记类并设置IgnoreSerializableAttribute来设置 //将Newtonsoft.Json.Serialization.DefaultContractResolver设置为false。 Fields = 2
<ignore_js_op>
测试代码:
- private const string jsonString = "{"Name":"http://www.itsvse.com","Sex":"男","Age":88}";
- [DataContract]
- [JsonObject(MemberSerialization.OptOut)]
- public class Test1
- {
- public string Name { get; set; }
- public string Sex { get; set; }
- public int Age { get; set; }
- }
- private void button1_Click(object sender, EventArgs e)
- {
- Test1 t1 = JsonConvert.DeserializeObject<Test1>(jsonString);
- Console.WriteLine(t1.Name);
- Console.WriteLine(t1.Sex);
- Console.WriteLine(t1.Age);
- Console.WriteLine();
- string json = JsonConvert.SerializeObject(new Test1() { Name = "哈哈", Sex = "女" });
- Console.WriteLine(json);
-
- }
复制代码
|
特性, json, 序列化, 反序列化
|
标签:Newtonsoft,Console,DataContract,特性,Json,序列化
来源: https://www.cnblogs.com/kelelipeng/p/13879672.html