Сериализация классов, которые реализуют List <T>для передачи по WCF - PullRequest
0 голосов
/ 20 апреля 2011


Я потратил некоторое время на написание кода для своего приложения, предполагая, что бит сериализации будет самой легкой его частью.Практически обе стороны (клиент и сервер) сделаны, и все, что мне нужно сделать, это передать класс AccountInfo из сервиса клиенту ...
Проблема в том, что AccountInfo наследует List, и поэтому атрибут [DataContract] недопустим,
Я попытался использовать атрибут [CollectionDataContract], но затем класс, полученный на другой стороне (клиенте), содержит только универсальные методы List без моих пользовательских реализованных свойств, таких как GroupTitle ...

Я работалРешение этой проблемы, но я не знаю, как его применить.
В основном все работает, когда я создаю свойство вместо того, чтобы наследовать List, но тогда я не могу связать этот класс с LongListSelector (WP7), потому что это не тип коллекции.
Есть три класса, о которых я говорю.
AccountInfo, который содержит несколько экземпляров:
AccountInfoGroup, который содержит несколько экземпляров:
AccountInfoEntry (этот список не наследует, поэтому нет проблем с сериализацией, и все свойства доступны).

Может ли кто-нибудь помочь мне использовать правильные атрибуты для сериализации и передачи этих классов с использованием метода WCF?


Вот код 2 из этих классов коллекции:

public class AccountInfo : List<AccountInfoGroup>
    {
        public AccountInfo()
        {
            UpdateTime = DateTime.UtcNow;
            EntryID = Guid.NewGuid();
        }

        public bool HasItems
        {
            get
            {
                return (Count != 0);
            }
            private set
            {
            }
        }
        public Guid EntryID
        {
            get;
            set;
        }
        public decimal GetTotalCredit()
        {
            decimal credit = 0;
            foreach (AccountInfoGroup acg in this.Where(item => item.Class == AccountInfoEntry.EntryType.Credit))
            {
                acg.Where(item => item.ItemClass == AccountInfoEntry.EntryType.Credit).ToList().ForEach(entry => 
                { credit += entry.Remaining; }
                );
            }
            return credit;
        }
        public bool UsedForCreditComparison = false;
        public DateTime UpdateTime { get; private set; }
    }

    public class AccountInfoGroup : List<AccountInfoEntry>
    {
        public AccountInfoEntry.EntryType Class 
        {
            get;
            private set;
       }
        public string Title
        {
            get
            {
                return AccountInfoEntry.ClassToString(Class);
            }
        }

        public AccountInfoGroup(AccountInfoEntry.EntryType groupClass)
        {
            this.@Class = groupClass;
        }

        public bool HasItems
        {
            get
            {
                return (Count != 0);
            }
            private set
            {
            }
        }
    }


Спасибо за любые предложения ...:)

1 Ответ

0 голосов
/ 20 апреля 2011

Образец, который вы имели, довольно болезнен для WCF при сериализации.Я предлагаю вам пересмотреть и иметь общие модели для ваших сообщений WCF (это означает, что он содержит только свойства с getter и setter, атрибутами сериализации).

Если у вас есть проблема с привязкой LongListSelector в WP7,может потребоваться преобразовать сообщение в фактический тип, поддерживаемый объектом WP7 для использования в привязке.

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