Как сериализовать / десериализовать универсальную коллекцию интерфейсов, созданную вручную - PullRequest
0 голосов
/ 16 августа 2011

Я знаю, что вы не можете сериализовать интерфейс, но для целей этого обсуждения есть соответствие 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 «Создать дочерний класс как« Элемент »» ...

1 Ответ

0 голосов
/ 16 августа 2011

Я пока мало что сделал в отношении сериализации XML, но я считаю, что вам также необходимо добавить атрибут Serializable в ваш класс или что-то еще.Обратите внимание, что есть некоторые вещи, к которым атрибут не может быть применен.

См .: >>

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

<Serializable()> _
Public Class ExampleClass

End Class
...