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