ПОЧЕМУ WCF не 'правильно' потребляет / выставляет абстрактные типы при размещении в виде веб-службы

Я давно занимаюсь разработкой веб-сервисов, но до недавнего времени мне никогда не приходилось предоставлять «сложные» сервисы WCF. Я был озадачен очевидным отсутствием «надлежащей поддержки» в WCF для абстрактных типов. Конечно - вы можете использовать их - конечно, вы можете заставить их «работать» ... вы просто не в конечном итоге с тем, что вы хотите ...

Первая проблема заключается в том, что если вы генерируете код из wsdl с абстрактным типом, вы получаете совершенно другой код, потому что он возвращается к xmlserializer, а не к DataContractSerializer. Это, очевидно, немного меньше, чем хотелось бы ... Я хотел бы использовать новый, более быстрый сериализатор, пожалуйста, спасибо ... (и все, что идет вместе с Service / DataContract)

с другой стороны - если вы начинаете с кода сначала и выставляете правильно приписанный абстрактный класс wcf как веб-сервис, то открытый wsdl НЕ содержит атрибут abstract = "true", делающий "абстрактный класс" технически конкретным ... Это не что я хочу конечно ...

У меня есть обходной путь, но он включает в себя сумасшедшее количество «хакеров», когда я сначала создаю контракт wsdl / xsd, удаляю любой абстрактный = «true» (о, давайте не будем упоминать, что я не могу использовать атрибуты в xsd: мы) и затем svcuitl результат ... Но теперь я остался с ac # api, у которого есть КОНКРЕТНЫЙ абстрактный класс, и мне тогда нужно изменить это, чтобы ДОБАВИТЬ абстрактное ключевое слово ... Это "работает", но это огромный пита - и не легко "сценарий" ...

Это все просто разбито! Я надеюсь, что кто-то может объяснить мне точно, «почему» это ... Я приветствую ответы, которые не ссылаются на «твердые» ресурсы, но я действительно жду, когда человек скажет мне - с надлежащей документацией (например, предпочтительно от добрый ол Дон Бокс сам) почему именно это ... Потому что я просто не понимаю ...

Спасибо всем - если кому-то захочется более подробной информации - пожалуйста, дайте мне знать!

ОБНОВЛЕНО ДЛЯ ДОБАВЛЕНИЯ ЗАПРОСА ОБРАЗЦА - начиная с c #

[ServiceContract]
public interface IShapeTest
{
  [OperationContract]
  AbsShape EchoShape(AbsShape shape);
}

public class ShapeTestImpl : IShapeTest
{
  public AbsShape EchoShape(AbsShape shape)
  {
    return shape;
  }
}

[KnownType(typeof(Square))]
public abstract class AbsShape
{
  [DataMember]
  public int numSides;
}

public class Square : AbsShape
{
  public Square() : base()
  {
    numSides = 4;//set the numSides to 'prove' it works
  }
}

ОЖИДАЕМЫЙ ТИП:

<xs:complexType name="AbsShape" abstract="true"> <!--NOTE abstract="true"-->
  <xs:sequence>
    <xs:element minOccurs="0" name="numSides" type="xs:int"/>
  </xs:sequence>
</xs:complexType>

ФАКТИЧЕСКИЙ ВЫПУСКАННЫЙ ТИП:

<xs:complexType name="AbsShape"> <!--NOTE the lack of abstract="true"-->
  <xs:sequence>
    <xs:element minOccurs="0" name="numSides" type="xs:int"/>
  </xs:sequence>
</xs:complexType>

Ответы на вопрос(4)

Ваш ответ на вопрос