An open plea to Microsoft to fix the serializers in WCF.

Posted by Scott Wojan on Geeks with Blogs See other posts from Geeks with Blogs or by Scott Wojan
Published on Fri, 10 Dec 2010 18:40:12 GMT Indexed on 2010/12/10 22:18 UTC
Read the original article Hit count: 281

Filed under:

I simply DO NOT understand how Microsoft can be this far along with a tool like WCF and it STILL tout it as being an "Enterprise" tool.

For example... The following is a simple xsd schema with a VERY simple data contract that any enterprise would expect an "enterprise system" to be able to handle:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Sample"
    targetNamespace="http://tempuri.org/Sample.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/Sample.xsd"
    xmlns:mstns="http://tempuri.org/Sample.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
 <xs:element name="SomeDataElement">
    <xs:annotation>
      <xs:documentation>This documents the data element. This sure would be nice for consumers to see!</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:all>
        <xs:element name="Description" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:minLength value="0"/>
              <xs:maxLength value="255"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:all>
      <xs:attribute name="IPAddress" use="required">
        <xs:annotation>
          <xs:documentation>Another explanation!  WOW!</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
 </xs:element>
 
</xs:schema> 

An minimal example xml document would be:

<?xml version="1.0"encoding="utf-8" ?>
<SomeDataElementxmlns="http://tempuri.org/Sample.xsd" IPAddress="1.1.168.10">
</SomeDataElement>

With the max example being: 

<?xml version="1.0"encoding="utf-8" ?>
<SomeDataElementxmlns="http://tempuri.org/Sample.xsd" IPAddress="1.1.168.10">
 <Description>ddd</Description>
</SomeDataElement>

This schema simply CANNOT be exposed by WCF. 

Let's list why: 

  1. svcutil.exe will not generate classes for you because it can't read an xsd with xs:annotation.
  2. Even if you remove the documentation, the DataContractSerializer DOES NOT support attributes so IPAddress would become an element this not meeting the contract
  3. xsd.exe could generate classes but it is a very legacy tool, generates legacy code, and you still suffer from the following issues:
  4. NONE of the serializers support emitting of the xs:annotation documentation.  You'd think a consumer would really like to have as much documentation as possible!
  5. NONE of the serializers support the enforcement of xs:restriction so you can forget about the xs:minLength, xs:maxLength, or xs:pattern enforcement.

Microsoft... please, please, please, please look at putting the work into your serializers so that they support the very basics of designing enterprise data contracts!!

 

© Geeks with Blogs or respective owner