#wcf #class #serialization #collections #inheritance
#wcf #класс #сериализация #Коллекции #наследование
Вопрос:
Я потратил некоторое время на написание кода для своего приложения, предполагая, что бит сериализации будет самой простой его частью. В значительной степени обе стороны (клиент и сервер) выполнены, и все, что мне нужно сделать, это передать class AccountInfo из сервиса клиенту…
Проблема в том, что AccountInfo наследует List и, следовательно, атрибут [DataContract] недействителен.
Я попытался использовать атрибут [CollectionDataContract], но тогда класс, который принимается на другой стороне (клиент), содержит только общие методы списка без моих пользовательских реализованных свойств, таких как GroupTitle…
Я разработал решение этой проблемы, но я не знаю, как его применить.
В принципе, все работает, когда я создаю свойство вместо наследования списка, но тогда я не могу привязать этот класс к LongListSelector (WP7), потому что это не тип коллекции.
Есть три класса, о которых я говорю.
AccountInfo, который содержит несколько экземпляров:
AccountInfoGroup, который содержит несколько экземпляров:
AccountInfoEntry (этот не наследует список, поэтому с его сериализацией проблем нет, и все свойства доступны).
Может ли кто-нибудь помочь мне использовать правильные атрибуты для сериализации и передачи этих классов с использованием метода WCF?
Вот код двух из этих классов коллекции:
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:
Приведенный вами пример довольно болезненный для WCF при сериализации. Я предлагаю вам пересмотреть и использовать общие модели для ваших сообщений WCF (это означает, что он содержит только свойства с getter и setter, атрибутами сериализации).
Если у вас возникла проблема с привязкой LongListSelector в WP7, возможно, вам захочется преобразовать сообщение в фактический тип, поддерживаемый объектом WP7, для использования в привязке.
Комментарии:
1. Я не совсем понимаю, что именно вы подразумеваете под общими моделями… Я совершенно новичок в WCF, и я был уверен, что это не будет проблемой. Эти классы идеально привязываются к LongListSelector, но я не знаю способа отправить их через WCF…
2. На самом деле это ваш ответ, который вы сказали: «Эти классы идеально привязываются к LongListSelector… нет способа … отправить … через WCF «. В принципе, ваш WCF имеет свои собственные объекты запроса / ответа (сообщения), а в вашем приложении WP7 у вас есть этот набор объектов, который идеально привязан к LongListSelector. Теперь, что вам нужно сделать, это преобразовать объект ответа из WCF в ваш объект в приложении WP7, чтобы полностью привязаться к LongListSelector.