Squeak.ru - шаблоны программирования

Почему WCF не может передать объект в словарь?

В моей службе WCF у меня есть объект QualifiedNumber, определенный как тип KnownType и ServiceKnown. Если бы я использовал QualifiedNumber в следующих методах:

Этот НЕ работает. Он выдает исключение, которое частично гласит:

Элемент 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value' содержит данные 'http://schemas.datacontract.org/2004/07 Контракт данных ServiceLibrary.Web.Model:QualifiedNumber. Десериализатор не знает ни одного типа, который сопоставляется с этим контрактом. не может десериализоваться, поскольку определение QualifiedNumber неизвестно.

[OperationContract]
public Dictionary<int, object> TestDictionaryGet()
{
    Dictionary<int, object> retDict = new Dictionary<int, object>();

    retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<"));
    retDict.Add(2, "pass a simple string");

    return retDict;
}

Этот РАБОТАЕТ

public struct element
{
    public int key;
    public object value;
}

[OperationContract]
public List<element> TestElementListGet()
{
    Dictionary<int, object> retDict = new Dictionary<int, object>();

    retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<"));
    retDict.Add(2, "pass a simple string");

    List<element> retElements = new List<element>();
    foreach (KeyValuePair<int, object> item in retDict)
    {
        element newElement;
        newElement.key = item.Key;
        newElement.value = item.Value;

        retElements.Add(newElement);
    }

    return retElements;
}

Что такого в словаре, который вызывает исключение?

10.05.2011

  • Дружеское напоминание - вы должны принять некоторые ответы. 10.05.2011

Ответы:


1

Вот подробная статья о сериализации универсального словаря в WCF:

http://www.request-response.com/blog/PermaLink,guid,ff5fab81-affb-4b2b-aa67-c80bdfc86cbd.aspx

Цитата из этой статьи будет такой:

Невозможно осмысленно передать семантику класса словаря .NET с помощью WSDL/XSD.

10.05.2011

2

Вам просто нужно добавить следующее свойство в ваш класс datacontract.

[DataMember]
public object UsedForKnownTypeSerializationObject;

Итак, теперь сгенерированный прокси содержит типы знаний, которые вы установили в контракте данных. У меня была такая же проблема, и это единственное решение, которое я придумал. Если вы не используете свойство типа Object для своего класса DataContract, сгенерированный прокси не содержит объявленных типов знаний.

Например:

[DataContract]
[KnownType(typeof(List<String>))]
public class Foo
{
    [DataMember]
    public String FooName { get; set; }

    [DataMember]
    public IDictionary<String, Object> Inputs { get; set; }

    [DataMember]
    private Object UsedForKnownTypeSerializationObject{ get; set; }

}

Это не так красиво, потому что вы получаете фиктивное свойство, которое не имеет никакой функциональной реализации. Но опять же, другого решения у меня нет.

20.08.2013

3

Отметьте QualifiedNumber атрибутом Serializeable.

10.05.2011
  • К сожалению, добавление атрибута Serializable не помогло. 10.05.2011

  • 4

    Вы можете обернуть словарь в список. Таким образом, ваш код будет выглядеть так:

    [OperationContract]
    public List<Dictionary<int, object>> TestDictionaryGet()
    {
        var resultList = new List<Dictionary<int, object>>();
        Dictionary<int, object> retDict = new Dictionary<int, object>();
    
        retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<"));
        retDict.Add(2, "pass a simple string");
    
        resultList.Add(retDict);
        return resultList;
    }
    

    Это не очень красиво. Но простой способ передать словарь через WCF.

    24.05.2016
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...