Ответ 1
Они делают то же самое, в конечном счете - но в разной области.
[ServiceKnownType]
определяет иерархию классов для всех методов этой службы или один метод службы (в зависимости от того, где вы поместите атрибут). Таким образом, в этом случае иерархия этого типа будет действительна и применима только для этой услуги или, возможно, даже для одного метода в этом контракте на обслуживание.
[KnownType]
делает то же самое, но на базовых контрактах данных. Любая служба, которая будет использовать этот контракт на данные, теперь также "наследует" все эти потенциальные классы потомков, которые могут или не могут быть тем, что вы хотите.
Итак, действительно, это вопрос того, какой областью действия вы хотите применить данную декларацию, чтобы поместить ее в контракт с данными, что делает ее видом "глобального" типа hiearchy, а использование [ServiceKnownType]
позволяет определить что-то, что действительны только для одного контракта на обслуживание или даже одного (или нескольких) методов по этому контракту на обслуживание.