Finally, with a lot of help from sgen.exe and a number of very talented inidividuals, I got the complex types to work this morning. The biggest issue was the way WCF compares Strings:
Java does sttring interning, .NET does not do this by default (this is why (object) string1 == (object) string2 is without further consideration a bad idea). Within the XML serialization framework however, WCF uses a NameTable to “atomize” (i.e. intern) strings. The Reader must return interned versions of the name, localName, namespace, etc. or the string comparisons in the generated classes will fail. Here is a sample from the generated code:
while (Reader.NodeType != System.Xml.XmlNodeType.EndElement &&
Reader.NodeType != System.Xml.XmlNodeType.None) {
if (Reader.NodeType == System.Xml.XmlNodeType.Element) {
if (!paramsRead[0] && ((object) Reader.LocalName == (object)id4_agedHelloResponse &&
(object) Reader.NamespaceURI == (object)id2_Item)) {
o.@agedHelloResponse = Read4_agedHelloResponse(false, true);
paramsRead[0] = true;
}
else {
UnknownNode((object)o, @”:agedHelloResponse”);
}
}
else {
UnknownNode((object)o, @”:agedHelloResponse”);
}
}
After fixing the Properties on XmlFiReader, it can now deserialize complex objects, and – as such – also use doc/lit in addition to rpc.