How can I include my derived class type name in the serialized JSON?
- by ChrisD
Sometimes working with the js Serializer is easy, sometimes its not. When I attempt to serialize an object that is derived from a base, the serializer decided whether or not to include the type name. When its present, the type name is represented by a ___type attribute in the serialized json like this: {"d":{"__type":"Commerce.Integration.Surfaces.OrderCreationRequest","RepId":0}}
The missing type name is a problem if I intend to ship the object back into a web method that needs to deserialize the object. Without the Type name, serialization will fail and result in a ugly web exception.
The solution, which feels more like a work-around, is to explicitly tell the serializer to ALWAYS generate the type name for each derived type. You make this declaration by adding a [GenerateScriptType())] attribute for each derived type to the top of the web page declaration.
For example, assuming I had 3 derivations of OrderCreationRequest; PersonalOrderCreationRequest, CompanyOrderCreationRequest, InternalOrderCreationRequestion, the code-behind for my web page would be decorated as follows:
[GenerateScriptType(typeof(PersonalOrderCreationRequest))]
[GenerateScriptType(typeof(CompanyOrderCreationRequest))]
[GenerateScriptType(typeof(InternalOrderCreationRequest))]
public partial class OrderMethods : Page
{
...
}
With the type names generated in the serialized JSON, the serializer can successfully deserialize instances of any of these types passed into a web method.
Hope this helps you as much as it did me.