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