JsonConvert.SerializeObject序列化为空应对
今天在尝试序列化某些类型时遇到调用的第三方类(NotSerializeJsonClass)无法使用Newtonsoft.Json的方式进行序列化,由于某种原因自定义类A继承自NotSerializeJsonClass,且使A里的公共属性能序列化,这里暂时想到两种解决方案:
- 找到一种方法指定A类型的公共属性序列化,而基类型不序列化
- 使用临时类型B,B里含有A类型的全部属性,序列化B类型,再对应A与B的转换关系
第一种:找到一种方法指定A类型的公共属性序列化,而基类型不序列化
class A
已知NotSerializeJsonClass不能使用JsonConvert.SerializeObject序列化,而且派生类也不可以,具体原因为第三方库,这里暂不讨论,例如:
class A : NotSerializeJsonClass
{
private int age;
private string name;
public int Age { get => age; set => age = value; }
public string Name { get => name; set => name= value; }
public A()
{
Age = 12;
Name = "Jim";
}
}
本例需要用到NotSerializeJsonClass的一些特性,也需要序列化Age跟Name两个属性,直接使用var value = JsonConvert.SerializeObject(new A(), Newtonsoft.Json.Formatting.Indented)监视value=”{}”。
解决方案为设置序列化模式 MemberSerialization,具体如下
[JsonObject(MemberSerialization.OptIn)]
class A : NotSerializeJsonClass
{
private int age;
private string name;
[JsonProperty]
public int Age { get => age; set => age = value; }
[JsonProperty]
public string Name { get => name; set => name= value; }
public A()
{
Age = 12;
Name = "Jim";
}
}
这种缺点是很明显的,在所有需要使用NotSerializeJsonClass派生类的序列化都需要添加这样的标签,但是问题可以解决,我们看下一种:
第二种:使用临时类型B,B里含有A类型的全部属性,序列化B类型,再对应A与B的转换关系
很纯粹的建立B类型,很显然B可直接序列化。然后对应A与B的关系,通用的使用AutoMapper,也可手动转换
class B
{
private int age;
private string name;
public int Age { get => age; set => age = value; }
public string Name { get => name; set => name= value; }
public A()
{
Age = 12;
Name = "Jim";
}
}
这种方案缺点就是构建一个无领域意义上的类型B,纯粹解决技术问题,但通用性还是可以的。