Как реализовать наследованный Словарь по WCF

Как объяснено в той же документации, если вы включите опцию --cached, она удалит только из индекса, а если вы не включите, удалит оба.

7
задан Jon Skeet 5 November 2008 в 23:28
поделиться

4 ответа

  • Используйте CollectionDataContract припишите как jezell предложенный
  • Вручную сгенерируйте ссылочный код (прокси) с SvcUtil, с помощью/collectionType параметра. Этот параметр не поддерживается vs2008 сервисной ссылкой GUI.

Источник: совместное использование типа набора WCF

1
ответ дан 6 December 2019 в 19:44
поделиться

Добавьте CollectionDataContract к классу Словаря:

Для получения дополнительной информации об использовании контрактов данных набора для реализации словарей проверьте эту ссылку:

http://msdn.microsoft.com/en-us/library/aa347850.aspx

10
ответ дан 6 December 2019 в 19:44
поделиться

Преамбула: отметьте то добавление "нового" Add не останавливает людей, называющих старое Add просто путем кастинга. Кроме того, с точки зрения "mex", который является очень неопределенным контрактом данных - это должно быть таким образом открыто? (много из object и т.д....)

Во-первых: не имейте Вас, скучал по некоторым [DataContract]/[DataMember] маркеры там? В особенности:

  • ResultClass. Значение
  • ParamData
  • ParamData. Значение
  • ParameterClass. Данные

Можно ли разъясниться точно, какую версию.NET Вы используете? DataContractSerializer и т.д. были настроены через пакеты обновления. С 3,5 установленными SP1 (единственная вещь я должен вручить) она действительно, по крайней мере, сериализирует и десериализовывает через DataContractSerializer (никакой стек WCF), и корректное Add метод называют.

Можно ли проверить ли следующие работы с локальной версией? (это работает на меня с 3,5 SP1, и с недостающими атрибутами) [производит сначала]:

1
MyDictionary
abc=123
def=ghi

Код:

        // or long-hand in C# 2.0
        ParameterClass pc = new ParameterClass {
            Data = new List<ParmData> { new ParmData {
                Value = new MyDictionary  {
                    {"abc",123},
                    {"def","ghi"}
                }}}};
        DataContractSerializer dcs = new DataContractSerializer(pc.GetType());
        string xml;
        using(StringWriter sw = new StringWriter())
        using(XmlWriter xw = XmlWriter.Create(sw)) {
            dcs.WriteObject(xw, pc);
            xw.Close();
            xml = sw.ToString();
        }
        using(StringReader sr = new StringReader(xml)) {
            ParameterClass clone = (ParameterClass)dcs.ReadObject(XmlReader.Create(sr));
            Console.WriteLine(clone.Data.Count);
            Console.WriteLine(clone.Data[0].Value.GetType().Name);
            MyDictionary d = (MyDictionary)clone.Data[0].Value;
            foreach (KeyValuePair<string, object> pair in d)
            {
                Console.WriteLine("{0}={1}", pair.Key, pair.Value);
            }
        }

Очевидно, это просто тестирует DataContractSerializer (без всего стека WCF), но это, кажется, работает... так: то же кодирует работу с Вашей локальной версией.NET? В противном случае действительно ли установка является последними 3,0 пакетами обновления опция? (идеально через установку 3,5 SP1).

Для получения информации я получаю xml:

<?xml version="1.0" encoding="utf-16"?><ParameterClass xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/"><Data><ParmData><Value xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" i:type="d4p1:ArrayOfKeyValueOfstringanyType"><d4p1:KeyValueOfstringanyType><d4p1:Key>abc</d4p1:Key><d4p1:Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:int">123</d4p1:Value></d4p1:KeyValueOfstringanyType><d4p1:KeyValueOfstringanyType><d4p1:Key>def</d4p1:Key><d4p1:Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:string">ghi</d4p1:Value></d4p1:KeyValueOfstringanyType></Value></ParmData></Data></ParameterClass>
1
ответ дан 6 December 2019 в 19:44
поделиться

Я наконец нашел способ сделать это. Я нашел эту ссылку, которая указала в правильном направлении, но я попытаюсь подвести итог.

  1. Удостоверьтесь, что Вы добавляете [CollectionDataContract] к Вашему пользовательскому набору
  2. Добавьте, что Сервисная Ссылка через VS как Вы обычно делает
  3. Разверните сервисную ссылку и ищите файл Reference.svcmap
  4. Под клиентским узлом опций Вы будете видеть

<CollectionMappings/>

Замените его следующим xml.

<CollectionMappings>
  <CollectionMapping TypeName = "Полный. Пространство имен. Здесь" Категория = "Список"/>
</CollectionMappings>

  1. Щелкните правой кнопкой по Сервисной Ссылке и нажмите обновление. Это больше не должно генерировать тот класс "прокси" и позволит Вам использовать свой общий класс.
1
ответ дан 6 December 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: