Problem
WCF throws System.ExecutionEngineException when deserializing and consuming data contracts with IList based attributes.
Forces
- Collection is changed as immutable when using IList
- Unable to convert it to List
- Unable to send it back to service consumer if required
Solution
Let us define a data contract Dump which contains IList of InternalDump.
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
I’ve declared a simple WCF service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
You are noticed that GetData just returns the deserialized “d” as a return value to the consumer. Being a .NET client, the consumer of this service as
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
At the consumer side, a new instance of Dump and InternalDump have been created, serialized and send it as input parameter for GetData. At the service side, the probelm is when deserializing the IList
The problem is not in any of the above code, instead WCF itself. The world’s so extensible ESB (enterprise service bus) framework assumed and convert IList
into T[] for platform neutral.
Unfortunately, do not know the root cause of problem 3 mentioned in “Forces” section. The solution is not the technical one, but a guideline.
Don’t use IList
Hope WCF in .NET 4.0 will resolve this issue.