I just joined the ASP.NET blogging community, being one of the 150 newly added bloggers by Joe Stagner,
so here's my first post.
I'd like to share my last research, about implementing custom JavaScript converters.
If you're using web services with Asp.Net Ajax, the custom entities moved back/forward between client side
and server side are converted/populated back to/from a JSON representation. It seems the ASP.NET runtime
checks whether a custom JavaScript convertor is registered for the custom entity type and if there is
none found, it will the objects of this type to JSON using reflections.
Custom JavaScript convertors can be registered in web.config file, under the <system.web.extensions>
section:
The JavaScriptConverter class has three abstract members which should be implemented:
Implementing custom converters increases the performance of the serialization process, but what if the
model has a lot of entities, with a lot of properties ? it would take a lot of time to develop converters
to support all of the types in the model. There is, of course, the code generation option, but almost each
change in the model would require a regeneration of the converters. A better approach would be to generate
these converters at runtime. I'm not exactly an expert in IL code, but let's just analyze this code using
Reflector:
Well, there is more code in this method than in the image above, but it doesn't look too cute, does it ? I don't
know about you, but I really like C# syntax more. Luckily, there is this namespace which can help me a bit
with it: System.Reflection.Emit, so I'll just reproduce the above code using the read only fields of the OpCodes
class. I'll generate a dynamic type, implementing the IJsConverter interface:
After this type is created, we'll keep an instance of it in a static Dictionary<Type, IJsConverter> variable
and call the Serialize and Deserialize methods whenever they are requested by the ASP.NET runtime:
I am not going to cover the details of IL generation, I'll move on to performance testing results.
Serializing 1,000,000 records:
- Default ASP.NET serializer: 26.813 seconds
- Custom serializer: 15.922 seconds
- Dynamic IL serializer: 16.500 seconds.
Of course, in the development process we have to find the best balance between performance, maintenance
costs and development costs (hmm, maybe those last 2 are a management issue).