C# WCF - Отправка Пользовательского BindableDictionary <строка, CustomObject> () По Прослушке

Править

  • Хорошо, у меня есть он, это не является сериализуемым......... так, как я иду о сериализации его?

Сценарий

  1. У меня есть пользовательский BindableDictionary, который я использую для привязки с управлением сеткой для того, чтобы автоматически обновить сетку, когда базовый источник данных изменяется.
  2. Я теперь хочу расширить свое приложение для использования WCF, так, чтобы, когда серверная сторона закончила обновлять BindableDictionary с новыми значениями, это могло передать этот словарь клиенту, который в свою очередь может выполнить обновление на Клиенте GUI.

Проблема

  • Как я иду об отправке этого пользовательского BindableDictionary по проводу?
  • Что лучший способ состоит в том, чтобы реализовать это?
  • Причина, которую я спрашиваю о методе внедрения, состоит в том, что каждый пример, который я видел Дуплекса, Обратных вызовов или Шаблона The Observer для "ПРОДВИЖЕНИЯ" моих данных клиенту, только использует пример передачи строк, и это очень примитивно - Каждый раз, когда я обновляю примеры для использования моего пользовательского BindableDictionary, я не могу заставить это работать.
  • Я пропускаю что-то?

BindableDictionary

    public class BindableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IBindingList
    {
        private Dictionary<TKey, TValue> source = new Dictionary<TKey, TValue>();

        void IBindingList.AddIndex(PropertyDescriptor property) { }
        object IBindingList.AddNew() { throw new NotImplementedException(); }
        bool IBindingList.AllowEdit { get { return false; } }
        bool IBindingList.AllowNew { get { return false; } }
        bool IBindingList.AllowRemove { get { return false; } }
        void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) { }
        int IBindingList.Find(PropertyDescriptor property, object key) { throw new NotImplementedException(); }
        bool IBindingList.IsSorted { get { return false; } }
        void IBindingList.RemoveIndex(PropertyDescriptor property) { }
        void IBindingList.RemoveSort() { }
        ListSortDirection IBindingList.SortDirection { get { return ListSortDirection.Ascending; } }
        PropertyDescriptor IBindingList.SortProperty { get { return null; } }
        bool IBindingList.SupportsChangeNotification { get { return true; } }
        bool IBindingList.SupportsSearching { get { return false; } }
        bool IBindingList.SupportsSorting { get { return false; } }
        int System.Collections.IList.Add(object value) { throw new NotImplementedException(); }
        void System.Collections.IList.Clear() { Clear(); }
        bool System.Collections.IList.Contains(object value) { if (value is TKey) { return source.ContainsKey((TKey)value); } else if (value is TValue) { return source.ContainsValue((TValue)value); } return false; }
        int System.Collections.IList.IndexOf(object value) { return -1; }
        void System.Collections.IList.Insert(int index, object value) { throw new NotImplementedException(); }
        bool System.Collections.IList.IsFixedSize { get { return false; } }
        bool System.Collections.IList.IsReadOnly { get { return true; } }
        void System.Collections.IList.Remove(object value) { if (value is TKey) { Remove((TKey)value); } }
        void System.Collections.IList.RemoveAt(int index) { throw new NotImplementedException(); }
        object System.Collections.IList.this[int index] { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } }

        private ListChangedEventHandler listChanged;

        event ListChangedEventHandler IBindingList.ListChanged
        {
            add { listChanged += value; }
            remove { listChanged -= value; }
        }

        protected virtual void OnListChanged(ListChangedEventArgs e)
        {
            var evt = listChanged;

            if (evt != null) evt(this, e);
        }

        public void Add(TKey key, TValue value)
        {
            source.Add(key, value);

            OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
        }

        public bool Remove(TKey key)
        {
            if (source.Remove(key))
            {
                OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));

                return true;
            }

            return false;
        }

        public TValue this[TKey key]
        {
            get
            {
                return source[key];
            }
            set
            {
                source[key] = value;

                OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
            }
        }

        void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
        {
            ((ICollection<KeyValuePair<TKey, TValue>>)source).Add(item);

            OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
        }

        bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)
        {
            if (((ICollection<KeyValuePair<TKey, TValue>>)source).Remove(item))
            {
                OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));

                return true;
            }

            return false;
        }

        public bool ContainsKey(TKey key) { return source.ContainsKey(key); }
        public ICollection<TKey> Keys { get { return source.Keys; } }
        public bool TryGetValue(TKey key, out TValue value) { return source.TryGetValue(key, out value); }
        public ICollection<TValue> Values { get { return source.Values; } }
        public void Clear() { source.Clear(); }
        bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item) { return ((ICollection<KeyValuePair<TKey, TValue>>)source).Contains(item); }
        void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) { ((ICollection<KeyValuePair<TKey, TValue>>)source).CopyTo(array, arrayIndex); }
        public int Count { get { return source.Count; } }
        bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly { get { return ((ICollection<KeyValuePair<TKey, TValue>>)source).IsReadOnly; } }
        public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() { return source.GetEnumerator(); }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); }
        bool ICollection.IsSynchronized { get { return false; } }
        object ICollection.SyncRoot { get { return null; } }
        void ICollection.CopyTo(Array array, int arrayIndex) { ((ICollection)source).CopyTo(array, arrayIndex); }
    }
1
задан Goober 30 July 2010 в 12:52
поделиться

2 ответа

Ответ заключался в том, что словарь не был сериализуемым. Теперь я создал сериализуемый словарь, который работает.

0
ответ дан 2 September 2019 в 22:34
поделиться

Если у вас есть определенный набор ключей / значений для вашего BindableDictionary , вы можете настроить собственный объект «передачи данных», который отражает эти значения:

[DataContract]
public class MyDTOType
{
   [DataMember]   
   public (keytype) Key { get; set; }
   [DataMember]   
   public (valuetype) Value { get; set; }
}

, а затем иметь объект DTO, который содержит List :

[DataContract]
public class MyDTOList
{
   [DataMember]   
   public List<MyDTOType> ListOfKeyValues { get; set; }
}

Теперь, если у вас есть сериализуемые типы для (keytype) и (valuetype) в вашем классе MyDTOType , это будет перемещаться по сети в WCF:

[ServiceContract]
interface IMyService
{
    [OperationContract]
    public MyDTOList GetAllValues(int someCriteria);
}

, и последний шаг, который вам нужно найти способ хорошо справиться, - это преобразование вашего BindableDictionary в MyDTOList , который содержит список экземпляров MyDTOType , которые содержат ключ типа TKey и значение типа TValue . Вероятно, вы могли бы использовать что-то вроде AutoMapper для обработки этого преобразования для отдельных элементов.

2
ответ дан 2 September 2019 в 22:34
поделиться
Другие вопросы по тегам:

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