как передать словарь предметов, составленный из словарей предметов? - PullRequest
0 голосов
/ 11 мая 2011

У меня есть служба, через которую я пытаюсь передать словарь объектов.Все хорошо и работает, пока я не добавлю словарь объектов, который затем содержит словарь для еще одного объекта.В приведенном ниже примере словарем, вызывающим проблему, будет класс A.

    //example

    public class A
    {
     public Dictionary<string,B> BValues { get; set; }
    }

    public class B
    {
     public Dictionary<string, C> CValues { get; set; }
    }

    public class C
    {
     int x;
     int y;
    }

Я попытался сделать словари типами знаний в моей службе, а также убедиться, что другие классы помечены как контракт данных, ихсвойства, помеченные атрибутом DataMember.Я в недоумении от того, что еще мне нужно или даже можно сделать, чтобы сделать эту работу.

Редактировать

Исключение:

Элемент 'schemas.microsoft.com/2003/10/Serialization/Arrays:Value';содержит данные 'schemas.microsoft.com/2003/10/Serialization/…;данные договора.Десериализатор не знает ни одного типа, который соответствует этому контракту.Добавьте тип, соответствующий 'ArrayOfKeyValueOfstringClassValuesNSpYOWsW', в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив его в список известных типов, передаваемых DataContractSerializer. '

1 Ответ

1 голос
/ 12 мая 2011

Чтобы попытаться понять, где это не получается, я настроил простую службу WCF, которая возвращает базовую вложенную Dictionary, которая прекрасно работает с несколькими добавленными в нее элементами.

    [OperationContract]
    Dictionary<int, Dictionary<int, int>> GetDictionary();

Исходя из этого, я предполагаю, что это проблема с вашими объектами (& возможно тот факт, что они находятся в Dictionary коллекциях).Я предлагаю вам сделать несколько тестов, чтобы сузить вашу проблему.

Сериализуем ли ваш класс - можете ли вы десериализовать один экземпляр вашего типа?(например, написать операцию для возврата объекта типа MyClass GetOneInstance();).Можете ли вы вернуть простой Dictionary вашего класса?

Существует несколько столкновений имен, которые WCF может вызвать у вас - если ваши классы имеют то же имя, что и ваша служба или ваша операция, дляНапример, операция GetSomething и объект с именем GetSomethingRequest или GetSomethingResponse не будут хорошо работать вместе - в основном из-за того, что запрос и ответ помещаются в автоматически именуемые конверты SOAP.Если ваши классы названы с использованием некоторых зарезервированных слов, вы можете попробовать переименовать их.

Исключение предполагает добавление атрибута KnownType.Это обычно применимо, когда вы возвращаете базовый тип, который может быть экземпляром наследуемого типа - так ли это?Включают ли ваши объекты наследование, и возвращаете ли вы базовые типы, которые могут быть экземплярами наследуемых типов?(Например, A:B и ваша операция возвращает B, но это может быть A)

...