Выясните, является ли экземпляр объекта DataContract сериализуемым в WCF - PullRequest
3 голосов
/ 04 декабря 2010

Я читал справочную страницу о том, какие типы сериализуются WCF, и неоднозначно, какие типы автоматически являются KnownType, а какие нет.Кто-нибудь может пролить свет на это?Например, если мой DataContract имеет член типа Object, он будет сериализован нормально, если я передам строку, но не если я передам словарь.Для словаря потребуется KnownType, несмотря на то, что он упоминается как поддерживаемый на этой странице.При этом у меня есть два вопроса:

  1. Итак, вопрос в том, какие автоматические типы знаний, которые всегда используются WCF?

  2. Мне нужен код, которыйвыяснит, является ли экземпляр объекта KnownType по умолчанию.Одним из решений было бы придумать исчерпывающий список из ответа на 1, а затем сравнить объект с каждым с помощью оператора «obj is type», но это кажется плохой реализацией.Есть ли более разумный способ?

РЕДАКТИРОВАТЬ:

Эта ссылка перечисляет типы, которые известны по умолчанию.Все примитивы меньше DateTimeOffset плюс XmlElement.Таким образом, осталось только два: Как я могу узнать, является ли объект примитивного типа?

РЕДАКТИРОВАТЬ 2: typeof (obj). IsPrimitive сделает большую часть работы!

1 Ответ

1 голос
/ 04 декабря 2010

Известный тип необходим, когда в сигнатуре контракта на операцию виден только базовый тип, но может быть возвращен некоторый производный тип. Пример:

[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, Объект и строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...