【发布时间】:2014-02-19 19:21:58
【问题描述】:
我有一个无法修改的外部数据合同。 Json 用于序列化这些类。我需要节省输出数据的大小,所以我想将原始字段名称更改为更短的版本,即:
public ClassWithLongName
{
public string FieldWithLongName = "field1";
public string FieldWithEvenLongerName = "field2";
}
应该被序列化为:
{"f1" = "field1", "f2" = "field2"}
为了能够正确反序列化它,必须以某种方式提供原始名称和短名称之间的映射(我在考虑 dictionary. 我应该为此使用 CustomConverter 还是 IContractResolver?
编辑:
有一种方法可以使用 CustomContractResolver:DefaultContractResolver。我正在重写 CreateProperty 方法来交换属性名称。问题是我无法获得序列化的对象类型(因此所有属性的名称都保存在一个公共映射中,而不是每种类型的单独映射)。你知道如何从 DefaultContractResolver 获取序列化的对象类型吗?
EDIT2:
类型可以取自 ResolveContract 方法(这里作为参数传递)。我已经实现了我需要的功能,但它存在一个巨大的问题。表现。我计算了循环序列化简单对象 10000 次所用的时间。默认序列化约为 150 毫秒,自定义序列化约为 15 秒。 你知道有没有办法避免它。我想开销是由反射引起的。但是默认序列化程序如何避免它呢?我使用 DefaultContractResolver 作为我的 CustomContractResolver 的父类,所以它应该使用父类正在使用的所有机制..
【问题讨论】: