Я знаю, что вы не можете сериализовать интерфейс, но для целей этого обсуждения есть соответствие 1: 1 между интерфейсом и классом данных домена, поэтому я предполагаю / надеюсь, что есть способ указать сериализатору использоватькласс домена, когда он видит данный интерфейс.
У меня довольно простая иерархическая структура объекта
- Профиль <Стандартный класс <ul>
- Элементы <Ручная коллекцияИнтерфейсный класс: Узлы (IProfile) <ul>
- Элемент <Стандартный класс </li>
Этюды <Ручная коллекция Класс: Узлы (ISTudy) <ul> Этюд <Стандартный класс </li>
Объявление коллекции Elements выглядит следующим образом:
Public Class Elements
Inherits Domain.Nodes(Of Domain.IElement)
Implements Domain.IElements
Public Sub New()
MyBase.New()
End Sub
Public Sub New(ByVal pItems As IEnumerable(Of Domain.IElement))
MyBase.New(pItems)
End Sub
End Class
По другим причинам я не наследую отСписок (Of T) или коллекция ключей или что-то еще, Nodes - это коллекция, созданная вручную, однако я реализую IEnumerable (Of T) в базовом классе Nodes (Of T).
Поэтому я пытаюсь сериализировать /Десериализовать в XML вНаименьшая возможная боль и усилие.Я получил инструкции использовать <DataContract()>
, <CollectionDataContract()>
и <DataMember()>
, но готов рассмотреть другие варианты.
Моя функция десериализации в настоящее время выглядит следующим образом:
Private Shared Function Deserialize(ByVal pFilePath As String) As Domain.IProfile
Dim lNewItem As Domain.IProfile
Dim lProfileSerializer As New System.Xml.Serialization.XmlSerializer(GetType(Domain.Profile))
lNewItem = CType(lProfileSerializer.Deserialize(Store.OpenFile(pFilePath, IO.FileMode.Open)), Domain.Profile)
Return lNewItem
End Function
ТАК, как вывы бы порекомендовали мне подойти к этому?Есть ли простой атрибут, который я могу использовать, чтобы сказать CollectionDataContract «Создать дочерний класс как« Элемент »» ...