Почему WCF не может передать объект в словарь? - PullRequest
5 голосов
/ 10 мая 2011

В моей службе 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;
}

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

Ответы [ 4 ]

4 голосов
/ 10 мая 2011

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

http://www.request -response.com / блог / PermaLink, справ, ff5fab81-affb-4b2b-aa67-c80bdfc86cbd.aspx

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

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

1 голос
/ 20 августа 2013

Вам просто нужно добавить следующее свойство в ваш класс 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; }

}

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

0 голосов
/ 24 мая 2016

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

[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.

0 голосов
/ 10 мая 2011

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

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