Известный тип необходим, когда в сигнатуре контракта на операцию виден только базовый тип, но может быть возвращен некоторый производный тип. Пример:
[OperationContract]
BaseClass Foo();
и в реализации:
public Foo()
{
return DerivedClass();
}
, где DerivedClass
происходит от BaseClass
. Так что вам нужно указать это явно либо в объявлении BaseClass
:
[KnownType(typeof(DerivedClass))]
[DataContract]
public class BaseClass { }
или используя [ServiceKnownType]
в декларации контракта на обслуживание:
[ServiceContract]
[ServiceKnownType(typeof(DerivedClass))]
public interface IService
{
[OperationContract]
BaseClass Foo();
}
или используя файл конфигурации:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="SomeNs.BaseClass, SomeAssembly">
<knownType type="SomeNs.DerivedClass, SomeAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
UPDATE:
Как указано в документации, вам не нужно это для примитивных типов:
Следующие типы встроены в
.NET Framework все можно сериализовать
и считаются примитивными
типы: Byte, SByte, Int16, Int32,
Int64, UInt16, UInt32, UInt64, Single,
Double, Boolean, Char, Decimal,
Объект и строка.