我有一个外部数据合约,不能修改。Json用于序列化这些类。我需要保存输出数据大小,所以我想将原始字段名称更改为较短的版本,即:
public ClassWithLongName
{
public string FieldWithLongName = "field1";
public string FieldWithEvenLongerName = "field2";
}
应该串行化为:
{"f1" = "field1", "f2" = "field2"}
为了能够正确地反序列化它,必须以某种方式提供原始名称和短名称之间的映射(我当时在考虑dictionary)。我应该使用CustomConverter或IContractResolver吗?
编辑:
使用CustomContractResolver有一种方法:DefaultContractResolver。我正在重写CreateProperty方法以交换属性名称。A目前的问题是我无法获得序列化的对象类型(因此所有属性的名称都保存在一个公共映射中,而不是每个类型单独的映射)。你知道我如何从DefaultContractResolver获得序列化的对象类型吗?
第2版:
该类型可以取自ResolveContract方法(此处作为参数传递)。我已经实现了我需要的功能,但有一个巨大的问题。性能。我在一个循环中计算了10000次序列化简单对象所花费的时间。对于默认序列化,它大约是150毫秒,对于自定义序列化,大约是15秒。你知道有没有办法避免吗?我想开销是由反射引起的。但是,默认序列化程序如何避免它呢?我使用DefaultContractResolver作为CustomContractResolver的父类,因此它应该使用父类正在使用的所有机制。。
使用匿名对象:
ClassWithLongName obj = new ClassWithLongName();
var anonymouse = new { FieldWithLongName = obj.FieldWithEvenLongerName, FieldWithEvenLongerName = obj.FieldWithEvenLongerName };
JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(anonymouse);
如果不想使用匿名对象,可以创建自己的对象,并使用AutoMapper
将外部数据契约映射到自己的类中,然后使用JavaScriptSerializer
类对其进行序列化