Понимание ServiceKnownType в WCF

у меня возникли проблемы с пониманием ServiceKnownType в WCF.

принято от этот блог, следующий код не работает:

[DataContract(Namespace = “http://mycompany.com/”)]
public class Shape{…}

[DataContract(Namespace = “http://mycompany.com/”)]
public class Circle : Shape {…}

[ServiceContract]
public interface IMyServer
{
    [OperationContract]
    bool AddShape(Shape shape);
}

.

IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel();

client.AddShape(new Circle());

причина, по которой это не работает, заключается в том, что вы пытаетесь добавить круг, но servicecontract позволяет только фигуру. Вы должны что-то делать с известными типами, но я немного смущен тем, как это работает.

поскольку этот код находится в службе, почему разве он не знает автоматически, что круг является производным от формы? Кроме того, что на самом деле делает ServiceKnownType?

когда ServiceKnownType помещается ниже DataContract, по-видимому, это заставляет его работать. Я предполагаю, что он говорит Эй, этот конкретный тип объекта, называемый формой, также может быть кругом. У меня возникли проблемы с пониманием, почему он будет делать это таким образом, потому что если вы добавите новый тип, такой как Square, вам придется добавить к классу формы ServiceKnownType для него. Разве не имеет смысла, если он не может сделать вывод, поместить KnownType на квадрат, а не на форму? Итак, квадрат говорит: "Эй, я-форма, и тебе не нужно возиться с классом формы?" Если ваш класс формы встроен в библиотеку и вы хотите создать свою собственную дервированную форму, такую как DiamondShape, вы не можете добавить ее в класс формы, потому что у вас нет доступа к исходному коду.

1 ответов


проблема в том, что WCF не входит во все сборки и пытается найти все возможные подтипы формы. Он также не передает информацию о типе (сборка, полное имя типа) с XML-документом.

таким образом, хотя не было бы проблемой генерировать тег "круг" на исходящем XML, входящий deserializater не знал бы, что с этим делать.

KnownType "hack" похож на реестр известных типов, который должен быть реализован обоими стороны. Это ясно. С помощью этого реестра десериализатор знает, что" круг " десериализуется до типа X без каких-либо шансов на неоднозначность и без необходимости анализировать все доступные или достижимые сборки для производных типов.

помните, квадрат не говорит "Я форма", он поставляется как XML-тег, и из этого вы не легко и автоматически знаете, какой класс .NET использовать.