Служба не знает, как обращаться с атрибутом типа «ComplexType» в XML, поэтому вам в основном нужно сообщить сериализатору на стороне службы, что он означает. Вы можете сделать это несколькими способами: либо добавить DataContractResolver, который сообщает сериализатору, что означает этот идентификатор неизвестного типа, либо добавить тип (если он существует на стороне службы) в список «известных типов», поэтому что сервис точно знает, что с ним делать. Я думаю, что вы должны использовать DataContractResolver.
В версии 4.0 платформы WCF представила распознаватель контракта данных. Вместо того, чтобы определять набор известных типов «статически» (например, указав типы непосредственно в KnownTypeAttribute, как вы делали до .NET 4), распознаватель контракта данных предоставляет несколько ловушек, которые позволяют вам указывать в тот момент, когда объект является будучи сериализованным или десериализованным, сопоставление между типом CLR и пространством имен / имен в XML, которое будет использоваться для представления этого «неизвестного» типа. Для этого вы просто наследуете от класса DataContractResolver и предоставляете логику отображения.
Я думаю, что это лучшее решение для вас, потому что вы, скорее всего, не хотите создавать фиктивный тип на стороне сервера просто для решения этой проблемы, что вы должны были бы сделать, если бы использовали KnownTypeAttribute. Единственное, что нужно помнить, это то, что распознаватель делает сериализацию медленнее, чем использование «стандартных» функций известных типов (поскольку известные типы являются статическими, они могут кэшироваться, и вызовы не должны выполняться постоянно), поэтому будьте внимательны. что при использовании резольвера дополнительная функциональность имеет цену в плане времени выполнения.